最近的项目,做图片的另存为功能,需要把图片存成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 |