4

私は数日間問題を解決しようとしていますが、理解できませんでした。私のアプリケーションは、ビットマップを使用して、ステガノグラフィと同様の方法で画像のピクセルを処理します。Bitmap を変更して取得した後、ModifiedBitmap と言ってピクセル値を確認すると、すべてが正しくなります。Compress メソッドを使用して Bitmap を 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)

ビットマップ形式が何であれ、それを処理して目的に合った適切なビットマップ形式を取得します。私の目的は、アルファを持ち、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 があり、アルファ値があります。PreparedBitmap を取得したとしましょう。Bitmap プロパティも確認しましたが、正確には ARGB_8888 であり、hasAlpha は true です。これまでのところ、それはすべてあるべき姿です。次に、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 をロードすると、ピクセル値が異なります。また、アルファ値はありません (hasAlpha は false) が、構成は同じ ARGB_8888 です。それがなぜなのか誰か知っていますか?ARGB_8888 ビットマップなので、ピクセル値に違いはありません。Androidは何とかPNGビットマップを圧縮しますか? ピクセル値の変更を防ぐために PNG 画像を保存するにはどうすればよいですか?

ModifiedBitmap ピクセル値が ARGB_8888 (128, 128, 128, 128) にあり、それを Bitmap.compress メソッドで保存した場合、再度ロードした後にアルファで同じ値を取得したいと考えています。私はそれを行う方法をすべて考えていません。

4

0 に答える 0