android Bitmap 存储为 bmp

您所在的位置:网站首页 bitmap存储标签 android Bitmap 存储为 bmp

android Bitmap 存储为 bmp

2024-01-20 12:21| 来源: 网络整理| 查看: 265

最近的项目,做图片的另存为功能,需要把图片存成jpg,png,bmp。对于jpg和png来说相对简单,android提供了bitmap.compress()方法可以马上解决。但是对于BMP这种格式,没有很好的支持。我花了几天时间在网上找了很久,都没有找到有用的答案,同样也发了疑问,没有合适的解答。

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 package com.test.bitmap;   import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;   import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView;   public class Mainactivity extends Activity { ImageView img;   @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.sd); img = (ImageView) findViewById(R.id.img1); btn.setOnClickListener( new OnClickListener() {   @Override public void onClick(View v) { // TODO Auto-generated method stub View view = v.getRootView(); view.setDrawingCacheEnabled( true ); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); if (bitmap != null ) { // ByteArrayOutputStream bos = new ByteArrayOutputStream(); // bitmap.compress(CompressFormat.PNG, 90, bos); 只能转成PNG、JPEG // byte[] data = bos.toByteArray(); // img.setImageBitmap(BitmapFactory.decodeByteArray(data, 0, // data.length)); int w = bitmap.getWidth(), h = bitmap.getHeight(); int [] pixels= new int [w*h]; bitmap.getPixels(pixels, 0 , w, 0 , 0 , w, h);     // ByteBuffer dst = ByteBuffer.allocate(bitmap.getRowBytes() // * h); // bitmap.copyPixelsToBuffer(dst);     // IntBuffer dst=IntBuffer.allocate(w*h); // bitmap.copyPixelsToBuffer(dst);     byte [] rgb = addBMP_RGB_888(pixels,w,h); byte [] header = addBMPImageHeader(rgb.length); byte [] infos = addBMPImageInfosHeader(w, h);     byte [] buffer = new byte [ 54 + rgb.length]; System.arraycopy(header, 0 , buffer, 0 , header.length); System.arraycopy(infos, 0 , buffer, 14 , infos.length); System.arraycopy(rgb, 0 , buffer, 54 , rgb.length); try { FileOutputStream fos = new FileOutputStream(Environment .getExternalStorageDirectory().getPath() + "/hello.bmp" ); fos.write(buffer); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); }     //BMP文件头 private byte [] addBMPImageHeader( int size) { byte [] buffer = new byte [ 14 ]; buffer[ 0 ] = 0x42 ; buffer[ 1 ] = 0x4D ; buffer[ 2 ] = ( byte ) (size >> 0 ); buffer[ 3 ] = ( byte ) (size >> 8 ); buffer[ 4 ] = ( byte ) (size >> 16 ); buffer[ 5 ] = ( byte ) (size >> 24 ); buffer[ 6 ] = 0x00 ; buffer[ 7 ] = 0x00 ; buffer[ 8 ] = 0x00 ; buffer[ 9 ] = 0x00 ; buffer[ 10 ] = 0x36 ; buffer[ 11 ] = 0x00 ; buffer[ 12 ] = 0x00 ; buffer[ 13 ] = 0x00 ; return buffer; }     //BMP文件信息头 private byte [] addBMPImageInfosHeader( int w, int h) { byte [] buffer = new byte [ 40 ]; buffer[ 0 ] = 0x28 ; buffer[ 1 ] = 0x00 ; buffer[ 2 ] = 0x00 ; buffer[ 3 ] = 0x00 ; buffer[ 4 ] = ( byte ) (w >> 0 ); buffer[ 5 ] = ( byte ) (w >> 8 ); buffer[ 6 ] = ( byte ) (w >> 16 ); buffer[ 7 ] = ( byte ) (w >> 24 ); buffer[ 8 ] = ( byte ) (h >> 0 ); buffer[ 9 ] = ( byte ) (h >> 8 ); buffer[ 10 ] = ( byte ) (h >> 16 ); buffer[ 11 ] = ( byte ) (h >> 24 ); buffer[ 12 ] = 0x01 ; buffer[ 13 ] = 0x00 ; buffer[ 14 ] = 0x18 ; buffer[ 15 ] = 0x00 ; buffer[ 16 ] = 0x00 ; buffer[ 17 ] = 0x00 ; buffer[ 18 ] = 0x00 ; buffer[ 19 ] = 0x00 ; buffer[ 20 ] = 0x00 ; buffer[ 21 ] = 0x00 ; buffer[ 22 ] = 0x00 ; buffer[ 23 ] = 0x00 ; buffer[ 24 ] = ( byte ) 0xE0 ; buffer[ 25 ] = 0x01 ; buffer[ 26 ] = 0x00 ; buffer[ 27 ] = 0x00 ; buffer[ 28 ] = 0x02 ; buffer[ 29 ] = 0x03 ; buffer[ 30 ] = 0x00 ; buffer[ 31 ] = 0x00 ; buffer[ 32 ] = 0x00 ; buffer[ 33 ] = 0x00 ; buffer[ 34 ] = 0x00 ; buffer[ 35 ] = 0x00 ; buffer[ 36 ] = 0x00 ; buffer[ 37 ] = 0x00 ; buffer[ 38 ] = 0x00 ; buffer[ 39 ] = 0x00 ; return buffer; }     private byte [] addBMP_RGB_888( int [] b, int w, int h) { int len = b.length; System.out.println(b.length); byte [] buffer = new byte [w*h * 3 ]; int offset= 0 ; for ( int i = len- 1 ; i>=w; i-=w) { //DIB文件格式最后一行为第一行,每行按从左到右顺序 int end=i,start=i-w+ 1 ; for ( int j=start;j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3