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

标签 android image bitmap depth bpp

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

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

最佳答案

回答我自己的问题...

在网上进行了一番艰难的搜索后,我意识到我必须创建两件事:黑白位图 - 并使用将低于 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:将位图对象保存为 bmp (1bpp) 文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447886/

相关文章:

Android 如何在 Activity 返回堆栈 "jump to another branch"中返回 "tree"?

image - CMYKJPEGImageReaderSpi 未加载

c# - 从多个 BitmapImage 创建 Tiff 文件

android - 单击时从列表中获取单个整数

android - 如果我的目标是 api 11+,我是否需要将类型face-manually设置为roboto-light,或者我可以只使用android :fontFamily ="sans-serif-light"

css - 如何垂直对齐图像,即div旁边的动态高度

opencv - 如何在 OpenCV 中捕获桌面(即将位图转换为 Mat)?

android - 错误:(191, 78)错误:在android中找不到符号变量ARGB_8888

android - 什么是 AppMeasurementService 以及为什么 Android Studio 将此服务添加到我的应用程序中?

Javascript 将动态图像从 URL 绘制到 Canvas 元素上