4

我正在尝试解决我的问题几天,但我无法弄清楚。我的应用程序使用位图以类似于隐写术的方式处理图像的像素。在我修改 Bitmap 并让我们说 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);
        }
}

当我使用这样的准备方法时,我总是得到正确格式的位图以及正确的参数和配置。所以现在,位图配置了 ARGB_8888 并具有 alpha 值。可以说我有 PreparedBitmap。我还检查了位图属性,它正是 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 具有与我在第一步中修改它的完全相同的像素值。我通过相同的过程加载位图:

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

但是他之前保存时加载的ModifiedBitmap具有不同的像素值。它也没有 alpha 值(hasAlpha 为假),但配置是相同的 ARGB_8888。有谁知道这是为什么?它是 ARGB_8888 位图,因此像素值不应该有差异。android会以某种方式压缩PNG位图吗?我应该如何保存 PNG 图像以防止像素值更改?

如果 ModifiedBitmap 像素值在 ARGB_8888 (128, 128, 128, 128) 中并且我通过 Bitmap.compress 方法保存它,我想在再次加载后获得与 alpha 相同的值。我不知道该怎么做。

4

0 回答 0