我有一个字节数组,对应于“灰度位图”(一个字节 - >一个像素),我需要为此图像创建一个PNG文件。
下面的方法有效,但是创建的png是巨大的,因为我使用的位图是一个ARGB_8888位图,每个像素占用4个字节而不是1个字节。
我无法使其与其他与ARGB_8888不同的Bitmap.Config兼容。也许ALPHA_8是我需要的,但我无法让它发挥作用。
我也尝试了一些其他帖子(Convert a Bitmap to GrayScale in Android)中包含的toGrayScale方法,但我的大小也有同样的问题。
public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width,
int height,File pngFile) throws IOException{
if (grayBytes.remaining()!=width*height){
Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null);
return false;
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// for each byte, I set it in three color channels.
int gray,color;
int x=0,y=0;
while(grayBytes.remaining()>0){
gray = grayBytes.get();
// integer may be negative as byte is signed. make them positive.
if (gray<0){gray+=256;}
// for each byte, I set it in three color channels.
color= Color.argb(-1, gray, gray, gray);
bitmap.setPixel(x, y, color);
x++;
if (x==width){
x=0;
y++;
}
}
FileOutputStream fos=null;
fos = new FileOutputStream(pngFile);
boolean result= bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
fos.close();
return result;
}
编辑:链接到生成的文件(它可能看起来很废话,但只是使用randon数据创建)。 http://www.tempfiles.net/download/201208/256402/huge_png.html
非常感谢任何帮助。
答案 0 :(得分:4)
正如您所注意到的那样,将灰度图像保存为RGB非常昂贵。如果您有亮度数据,那么最好保存为灰度PNG而不是RGB PNG。
Android Framework中提供的位图和图像功能非常适合读取和编写框架和UI组件支持的图像格式。此处不包括灰度PNG。
如果您想在Android上保存Grayscale PNG,那么您需要使用像http://code.google.com/p/pngj/这样的库
答案 1 :(得分:2)
如果您使用OPENCV for Android库,您可以使用该库将二进制数据保存到png文件。 我的方式是: 在jni部分, 设置其数据以字节数组开头的Mat:
jbyte* _ByteArray_BrightnessImgForOCR = env->GetByteArrayElements(ByteArray_BrightnessImgForOCR, 0);
Mat img(ByteArray_BrightnessImgForOCR_h, ByteArray_BrightnessImgForOCR_w, CV_8UC1, (unsigned char *) _ByteArray_BrightnessImgForOCR);
然后将其写入png文件。
imwrite("/mnt/sdcard/binaryImg_forOCR.png", img);
当然,您需要花些时间熟悉OpenCV和Java本机编码。在OpenCV for Android examples之后,学习起来很快。