本文主要介绍的是Bitmap文件解析的一个简单示例,例子是在Androd上写的,用到的图像只有24位深度的这一种。
Bitmap文件的基本结构参考:
http://www.cnblogs.com/jerry-lin300/archive/2011/12/16/2233854.html
例子中用到的原始Bitmap图片:
主要过程就是加载Bitmap图片进行解析,简单的灰度处理,转换成Android中Bitmap对象,然后显示出来。
截图:
在分析Bitmap结构过程中可以利用 BMPAnalyzer 这个小工具,上面会显示出主要的参数:
Bitmap算是最简单的图像格式了,解析也比较简单,有几点注意下就好了:
1.文件信息中各字段是采用大端还是小端存储的;
2.图像内容读取的顺序(biHeight的正负),一般是从左下角开始按行读取;
3.字节补齐的问题,每行4个字节整数倍存储;
4.文件解析的时候考虑有无调色板(颜色表)。
下面是代码:
package com.ysm.bmp;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView mResultView;
public int mWidth;
public int mHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultView = (ImageView) findViewById(R.id.result_image);
new BmpConvertTask().execute();
}
private byte[] loadBmpFile() throws IOException {
InputStream is = getResources().getAssets().open("stone.bmp");
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
int ch;
while ((ch = is.read()) != -1) {
bytestream.write(ch);
}
byte imgdata[] = bytestream.toByteArray();
bytestream.close();
return imgdata;
}
private int[] bitmapFilter(byte[] fileBytes) {
/**************** bitmap file head *******************/
int offset = 0;
//"BM"
//int BM = fileBytes[offset+1] & 0xff;
//BM = (BM << 8) | (fileBytes[offset] & 0xff) ;
offset