博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
把bitmap保存成 BMP的格式 并且位深度为1
阅读量:5808 次
发布时间:2019-06-18

本文共 4416 字,大约阅读时间需要 14 分钟。

hot3.png

生成图片的要求:图像格式采用单色位图文件格式(BMP)  要求bmp的位深度为1

参考:

关于BMP大小的计算方法:

利用java实现画图板和保存读取BMP格式的图片:

 

代码有点小瑕疵 : bitmap的图片宽度要求是:8的整数倍

/**     * 将Bitmap存为 .bmp格式图片     *     * @param bitmap     */    public void saveBmp(Bitmap bitmap) {        if (bitmap == null)            return;        // 位图大小        int nBmpWidth = bitmap.getWidth();        int nBmpHeight = bitmap.getHeight();        // 图像数据大小        int bufferSize = nBmpHeight * nBmpWidth /8 + 4*2;        try {            // 存储文件名            String filename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "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 = 1;            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 buf[] = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff,0, 0, 0, 0, 0};            fileos.write(buf);            // 像素扫描            int bw = nBmpWidth/8;            byte recv[] = new byte[bw*nBmpHeight];            int[] pixels = new int[nBmpWidth * nBmpHeight];            bitmap.getPixels(pixels, 0, nBmpWidth, 0, 0, nBmpWidth, nBmpHeight);            for(int i = nBmpHeight - 1, ii = 0; i >= 0; i--, ii++){                for(int j = 0; j < nBmpWidth; j++){                    int clr = pixels[nBmpWidth * i + j];                    int red = (clr & 0x00ff0000) >> 16;                    int green = (clr & 0x0000ff00) >> 8;                    int blue = clr & 0x000000ff;                    byte gray = (RGB2Gray(red, green, blue));                    recv[(nBmpWidth * ii + j) / 8] = (byte) (recv[(nBmpWidth * ii + j) / 8] | (gray << (7 - ((nBmpWidth * ii + j) % 8))));                }            }            fileos.write(recv);            fileos.flush();            fileos.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    private byte RGB2Gray(int r, int g, int b) {        return (false ? ((int) (0.29900 * r + 0.58700 * g + 0.11400 * b) > 200)                : ((int) (0.29900 * r + 0.58700 * g + 0.11400 * b) < 200)) ? (byte) 1 : (byte) 0;    }    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);    }

 

转载于:https://my.oschina.net/547217475/blog/1548052

你可能感兴趣的文章
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
关于Css选择器优先级
查看>>
My97DatePicker 日历插件
查看>>