android保存和加载PNG位图差异

android保存和加载PNG位图差异,android,bitmap,compression,png,save,Android,Bitmap,Compression,Png,Save,几天来,我一直在努力解决我的问题,但我还是没能解决。 我的应用程序使用位图处理图像像素,就像隐写术一样。 在我修改位图并获取后,让我们假设ModifiedBitmap并检查像素值,一切都是正确的。 在我使用压缩方法将位图保存为PNG后,问题开始出现。当我将ModifiedBitmap加载回内存时,像素值会更改。当我使用ARGB_8888以PNG格式存储位图时,我假设以PNG格式保存并加载图像后,这些值将是相同的 有关更多详细信息,我将使用以下代码加载位图: BitmapFactory.Optio

几天来,我一直在努力解决我的问题,但我还是没能解决。 我的应用程序使用位图处理图像像素,就像隐写术一样。 在我修改位图并获取后,让我们假设ModifiedBitmap并检查像素值,一切都是正确的。 在我使用压缩方法将位图保存为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)
无论位图格式是什么,我都会对其进行处理,以获得适合我的位图格式。我的目标是获得具有alpha并位于ARGB_8888配置中的位图。我使用以下内容准备新位图:

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);
        }
}
之后,我存储了PNG图像文件。 然后我想再次加载ModifiedBitmap并以相反的方式处理位图。我的先决条件是ModifiedBitmap的像素值与我在第一步中修改的像素值完全相同。我通过相同的过程加载位图:

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后,使用alpha获得相同的值。我不知道该怎么做。

这可能是因为在保存或重新加载过程中阿尔法的预乘吗?
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = false;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.decodeFile(picturePath, opt)