android保存并加载PNG位图差异

时间:2012-08-08 11:43:02

标签: android bitmap compression png save

我正试图解决我的问题好几天了,我无法理解。 我的应用程序使用Bitmap以与隐写术相似的方式处理图像的像素。 修改Bitmap后得到我们说的ModifiedBitmap并检查像素值一切正确。 使用compress方法将位图保存为PNG后,问题就开始了。当我将ModifiedBitmap加载回内存时,像素值会发生变化。当我使用ARGB_8888以PNG格式存储位图时,我假设在以PNG格式保存和加载图像后,值将保持不变。

有关更多详细信息,我正在使用以下代码加载位图:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = false;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.decodeFile(picturePath, opt)

无论Bitmap格式是什么,我都会处理它,以便为我的目的获得正确的Bitmap格式。我的目标是获得具有alpha的位图并且在ARGB_8888配置中。我用以下内容准备新的Bitmap:

int width = this.imageToProcess.getWidth();
int height = this.imageToProcess.getHeight();

Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
        int pixel = this.imageToProcess.getPixel(i, j);
            int newColor = 0;
            if (this.imageToProcess.hasAlpha()) {
                newColor = Color.argb(Color.alpha(pixel), Color.red(pixel), Color.green(pixel), Color.blue(pixel));
            } else {
                newColor = Color.argb(255, Color.red(pixel), Color.green(pixel), Color.blue(pixel));
            }
        dest.setPixel(i, j, newColor);
        }
}

当我使用这样的准备方法时,我总是使用正确的参数和配置获得正确的Bitmap格式。所以现在,Bitmap具有配置ARGB_8888并具有alpha值。让我们说我有PreparedBitmap。我还检查了Bitmap属性,它正好是ARGB_8888和hasAlpha是真的。到目前为止,它应该是应有的。 然后我在PreparedBitmap上进行某种像素修改,并准备保存。 我使用以下代码将位图保存为PNG:

String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
File file = new File(path, "image.png");
fOut = new FileOutputStream(file);
modifiedBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());

之后我存储了PNG图像文件。 然后我想再次加载ModifiedBitmap并以相反的方式处理Bitmap。我的先决条件是ModifiedBitmap具有与我在第一步中修改它的像素值完全相同的像素值。我通过相同的过程加载Bitmap:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = false;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.decodeFile(picturePath, opt)

但是他在保存之前加载了ModifiedBitmap具有不同的像素值。它也没有alpha值(hasAlpha为false),但配置是相同的ARGB_8888。 有人知道为什么吗?它是ARGB_8888位图,所以像素值不应该有差异。 android会以某种方式压缩PNG位图吗?我应该如何保存PNG图像以防止像素值发生变化?

如果ModifiedBitmap像素值在ARGB_8888(128,128,128,128)中并且我通过Bitmap.compress方法保存它,我希望在再次加载后获得与alpha相同的值。我不知道如何做到这一点。

0 个答案:

没有答案