【问题标题】:Android: Save Bitmap object as a bmp (1bpp) file formatAndroid:将位图对象保存为 bmp (1bpp) 文件格式
【发布时间】:2014-10-16 08:37:06
【问题描述】:

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

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

【问题讨论】:

    标签: android image bitmap depth bpp


    【解决方案1】:
    Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bmpMonochrome); 
    ColorMatrix ma = new ColorMatrix(); 
    ma.setSaturation(0); 
    Paint paint = new Paint(); 
    paint.setColorFilter(new ColorMatrixColorFilter(ma)); 
    canvas.drawBitmap(bmpSrc, 0, 0, paint);
    

    像这样! Source

    【讨论】:

    • 这有助于将您的图像作为单色位图,但不能将其保存为 1bpp BMP 文件。
    • 保存后会发生什么? :) 没试过。告诉我。
    • 如果您将其保存为 24 位图像,就像此实现一样:github.com/ultrakain/AndroidBitmapUtil/blob/master/src/com/… 它只是将内容保存为黑白图像,但使用 Windows 的 24 位深度 bmp 图像。
    • 仅供参考:将饱和度设置为 0 不会生成黑白图像。它会生成不饱和的图像,或者看起来像灰度图像。但它不是 1 位(黑色或白色)像素集。
    【解决方案2】:

    回答我自己的问题...

    在整个网络上进行了一番艰难的搜索后,我意识到我必须创建 2 个东西:一个黑白位图 - 并使用将 128 以下颜色全部设为 0 并将其余颜色设为 255 的方法做到这一点,就像这样(this是 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 };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多