0

実行時にいくつかの値を変更したいプロジェクトに PNG ファイルがあります。

    ByteArrayOutputStream output = new ByteArrayOutputStream();

    try {
        InputStream input = getIntro().getAssets().open("image.png");
        byte[] tmp = new byte[1024];
        int ret = 0;
        while ((ret = input.read(tmp, 0, 1024)) >= 0) {
            output.write(tmp, 0, ret);
        }
    } catch (IOException ex) {
        System.out.print(ex);
    }

    byte[] imgArray = output.toByteArray();

    imgArray[1000] = (byte) Color.red(Const.SOMEVALUE);

    return BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length);

行で何をしてもimgArray[1000] = (byte) Color.red(MyApplication.COLOR_BOARD_BG)、空の画像が得られます。その行を使用せずにバイト配列を手動で変更しても問題ありませんが、(ヘッダーまたは本文で) 変更した内容は何も変わりません = 空白の画像です。

実際にはパレット情報を変更しようとしますが、ここでは例として、画像データ内の値である 1000 番目の要素を変更します。

4

1 に答える 1

0

PNG ファイル形式は、画像データを圧縮形式で保存します。どこかで 1 バイトだけ変更すると、おそらく内部チェックサムが無効になり、無効なイメージになるため、それを行うことはできません。それに加えて、各 PNG チャンクは 32 ビット CRC チェックサムによって保護されているため、ファイルの任意の部分を変更するには、少なくともチェックサムを変更するチャンクに更新する必要があります。

画像のピクセルを変更したい場合は、BitmapFactory や Android の Bitmap などの利用可能なライブラリを使用して、最初に PNG データをデコードする方が簡単です。

Bitmap png = BitmapFactory.decodeFile(selectedImagePath);
png.setPixel(34,43,0xFFFF0000);
于 2013-07-21T09:22:58.810 に答える