android将彩图转为黑白_Android Bitmap保存为.bmp格式,图像转化为黑白图片 | 学步园...

该博客介绍了如何在Android中将彩色图片转换为黑白图片,并将其保存为BMP格式。主要方法包括获取View的Bitmap,转换Bitmap颜色到黑白,以及将Bitmap写入BMP文件。代码提供了从View生成Bitmap,将彩色图转为黑白图的函数,以及保存Bitmap为BMP格式的详细步骤。
摘要由CSDN通过智能技术生成

/**

* 把一个View的对象转换成bitmap

*/

static Bitmap getViewBitmap(View v) {

v.clearFocus();

v.setPressed(false);

//能画缓存就返回false

boolean willNotCache = v.willNotCacheDrawing();

v.setWillNotCacheDrawing(false);

int color = v.getDrawingCacheBackgroundColor();

v.setDrawingCacheBackgroundColor(0);

if (color != 0) {

v.destroyDrawingCache();

}

v.buildDrawingCache();

Bitmap cacheBitmap = v.getDrawingCache();

if (cacheBitmap == null) {

Log.e("BtPrinter", "failed getViewBitmap(" + v + ")", new RuntimeException());

return null;

}

Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);

// Restore the view

v.destroyDrawingCache();

v.setWillNotCacheDrawing(willNotCache);

v.setDrawingCacheBackgroundColor(color);

return bitmap;

}

/**

* 将彩色图转换为黑白图

*

* @param 位图

* @return 返回转换好的位图

*/

public static Bitmap convertToBlackWhite(Bitmap bmp) {

int width = bmp.getWidth(); // 获取位图的宽

int height = bmp.getHeight(); // 获取位图的高

int[] pixels = new int[width * height]; // 通过位图的大小创建像素点数组

bmp.getPixels(pixels, 0, width, 0, 0, width, height);

int alpha = 0xFF << 24;

for (int i = 0; i < height; i++) {

for (int j = 0; j < width; j++) {

int grey = pixels[width * i + j];

int red = ((grey & 0x00FF0000) >> 16);

int green = ((grey & 0x0000FF00) >> 8);

int blue = (grey & 0x000000FF);

grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);

grey = alpha | (grey << 16) | (grey << 8) | grey;

pixels[width * i + j] = grey;

}

}

Bitmap newBmp = Bitmap.createBitmap(width, height, Config.RGB_565);

newBmp.setPixels(pixels, 0, width, 0, 0, width, height);

Bitmap resizeBmp = ThumbnailUtils.extractThumbnail(newBmp, 380, 460);

return resizeBmp;

}

/**

* 将Bitmap存为 .bmp格式图片

* @param bitmap

*/

private void saveBmp(Bitmap bitmap) {

if (bitmap == null)

return;

// 位图大小

int nBmpWidth = bitmap.getWidth();

int nBmpHeight = bitmap.getHeight();

// 图像数据大小

int bufferSize = nBmpHeight * (nBmpWidth * 3 + nBmpWidth % 4);

try {

// 存储文件名

String filename = "/sdcard/test.bmp";

File file = new File(filename);

if (!file.exists()) {

file.createNewFile();

}

FileOutputStream fileos = new FileOutputStream(filename);

// bmp文件头

int bfType = 0x4d42;

long bfSize = 14 + 40 + bufferSize;

int bfReserved1 = 0;

int bfReserved2 = 0;

long bfOffBits = 14 + 40;

// 保存bmp文件头

writeWord(fileos, bfType);

writeDword(fileos, bfSize);

writeWord(fileos, bfReserved1);

writeWord(fileos, bfReserved2);

writeDword(fileos, bfOffBits);

// bmp信息头

long biSize = 40L;

long biWidth = nBmpWidth;

long biHeight = nBmpHeight;

int biPlanes = 1;

int biBitCount = 24;

long biCompression = 0L;

long biSizeImage = 0L;

long biXpelsPerMeter = 0L;

long biYPelsPerMeter = 0L;

long biClrUsed = 0L;

long biClrImportant = 0L;

// 保存bmp信息头

writeDword(fileos, biSize);

writeLong(fileos, biWidth);

writeLong(fileos, biHeight);

writeWord(fileos, biPlanes);

writeWord(fileos, biBitCount);

writeDword(fileos, biCompression);

writeDword(fileos, biSizeImage);

writeLong(fileos, biXpelsPerMeter);

writeLong(fileos, biYPelsPerMeter);

writeDword(fileos, biClrUsed);

writeDword(fileos, biClrImportant);

// 像素扫描

byte bmpData[] = new byte[bufferSize];

int wWidth = (nBmpWidth * 3 + nBmpWidth % 4);

for (int nCol = 0, nRealCol = nBmpHeight - 1; nCol < nBmpHeight; ++nCol, --nRealCol)

for (int wRow = 0, wByteIdex = 0; wRow < nBmpWidth; wRow++, wByteIdex += 3) {

int clr = bitmap.getPixel(wRow, nCol);

bmpData[nRealCol * wWidth + wByteIdex] = (byte) Color.blue(clr);

bmpData[nRealCol * wWidth + wByteIdex + 1] = (byte) Color.green(clr);

bmpData[nRealCol * wWidth + wByteIdex + 2] = (byte) Color.red(clr);

}

fileos.write(bmpData);

fileos.flush();

fileos.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

protected void writeWord(FileOutputStream stream, int value) throws IOException {

byte[] b = new byte[2];

b[0] = (byte) (value & 0xff);

b[1] = (byte) (value >> 8 & 0xff);

stream.write(b);

}

protected void writeDword(FileOutputStream stream, long value) throws IOException {

byte[] b = new byte[4];

b[0] = (byte) (value & 0xff);

b[1] = (byte) (value >> 8 & 0xff);

b[2] = (byte) (value >> 16 & 0xff);

b[3] = (byte) (value >> 24 & 0xff);

stream.write(b);

}

protected void writeLong(FileOutputStream stream, long value) throws IOException {

byte[] b = new byte[4];

b[0] = (byte) (value & 0xff);

b[1] = (byte) (value >> 8 & 0xff);

b[2] = (byte) (value >> 16 & 0xff);

b[3] = (byte) (value >> 24 & 0xff);

stream.write(b);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值