gpt4 book ai didi

Android:将Bitmap对象保存为bmp(1bpp)文件格式

转载 作者:行者123 更新时间:2023-11-29 00:17:43 57 4
gpt4 key购买 nike

基于@ben75 提出的这个问题:Android : save a Bitmap to bmp file format

我现在的问题是:如何获得每像素 1 位深度的 BMP 图像(黑白)?

最佳答案

回答我自己的问题...

在整个网络上进行了一番艰难的搜索后,我意识到我必须创建 2 个东西:黑白位图 - 并使用将低于 128 的颜色全为 0,其余颜色全为 255 的方法来做到这一点,就像这样(这是 C# 代码,因为我正在使用 Xamarin 编写我的应用程序代码):

private void ConvertArgbToOneColor (Bitmap bmpOriginal, int width, int height){
int pixel;
int k = 0;
int B=0,G=0,R=0;
try{
for(int x = 0; x < height; x++) {
for(int y = 0; y < width; y++, k++) {
pixel = bmpOriginal.GetPixel(y, x);

R = Color.GetRedComponent(pixel);
G = Color.GetGreenComponent(pixel);
B = Color.GetBlueComponent(pixel);

R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B);
if (R < 128) {
m_imageArray[k] = 0;
} else {
m_imageArray[k] = 1;
}
}
if(m_dataWidth>width){
for(int p=width;p<m_dataWidth;p++,k++){
m_imageArray[k]=1;
}
}
}
}catch (Exception e) {
System.Console.WriteLine ("Converting to grayscale ex: " + e.Message);
}
}

然后获取单色图片的byteArray:

int length = 0;
for (int i = 0; i < m_imageArray.Length; i = i + 8) {
byte first = m_imageArray[i];
for (int j = 0; j < 7; j++) {
byte second = (byte) ((first << 1) | m_imageArray[i + j]);
first = second;
}
m_rawImage[length] = first;
length++;
}

最后使用以下变量“手动”创建位图并将它们放入 FileOutputStream 以保存文件:

    private static int FILE_HEADER_SIZE = 14;
private static int INFO_HEADER_SIZE = 40;

// Bitmap file header
private byte[] bfType = { (byte) 'B', (byte) 'M' };
private int bfSize = 0;
private int bfReserved1 = 0;
private int bfReserved2 = 0;
private int bfOffBits = FILE_HEADER_SIZE + INFO_HEADER_SIZE + 8;

// Bitmap info header
private int biSize = INFO_HEADER_SIZE;
private int biWidth = 0;
private int biHeight = 0;
private int biPlanes = 1;
private int biBitCount = 1;
private int biCompression = 0;
private int biSizeImage = 0;
private int biXPelsPerMeter = 0x0;
private int biYPelsPerMeter = 0x0;
private int biClrUsed = 2;
private int biClrImportant = 2;

// Bitmap raw data
private byte[] bitmap;

// Scanlinsize;
int scanLineSize = 0;

// Color Pallette to be used for pixels.
private byte[] colorPalette = { 0, 0, 0, (byte) 255, (byte) 255,
(byte) 255, (byte) 255, (byte) 255 };

关于Android:将Bitmap对象保存为bmp(1bpp)文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447886/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com