您的位置:首页 > 移动开发 > Android开发

Android Bitmap保存为.bmp格式,图像转化为黑白图片

2016-10-28 02:35 1836 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

[java] view
plain copy

/**  

     * 把一个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);  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐