2

この質問は私の前の質問に関連していますが、理解するためにそれを読む必要はありません。

今、ビットマップを小さな部分に変換してから、それらの小さな部分を保存しようとしていました。

私が得る問題は、サイズが完全な画像よりもはるかに大きいファイルに最初の部分のみが保存されることです。以下は私が使用しているコードです:

for (int i = 0; i < Image.getHeight(); i++)
{
    fout = new FileOutputStream(file, true);
    Bitmap temp = Bitmap.createBitmap(Image, 0, i,Image.getWidth(), 1);
    temp.compress(Bitmap.CompressFormat.PNG, 100, fout);
    fout.flush();
    fout.close();
}

コードは非常に単純ですが、最初の行だけがファイルに書き込まれる理由がわかりません。

更新:: マーリンとディーパックは正しいです。別の名前を付けて試してみたところ、すべての部分が別のファイルに正常に書き込まれました。これで問題がわかりました。2 番目のチャンクからヘッダーを削除し、最初のチャンクから eof を削除する必要がありますか?

4

3 に答える 3

3

非常に非効率なのに、なぜこんなことをしているの?

したがって、一度に 1 行のピクセルを書き込んでいますが、正しい追加フラグを true に設定して同じファイルに繰り返し書き込んでいます。

あなたが見逃しているのは、ビットマップを書くとき、あなたが書いているのは自己完結型であるという事実です。したがって、最初の行を読み取るプログラムは、それがビットマップ全体であると想定します。

これは、テキスト ファイルに EOF マーカーがあるのと同じです。すべての行が書き込まれていますが、それを読むとき、リーダーは最初の EOF の後にあきらめます

何が起こっているのかをより完全に理解するには、PNG ファイルの構造を調査する必要があります。

于 2011-12-21T15:09:00.783 に答える
1

各行をpngとしてファイルに追加できないため、ロジックが間違っています。おそらくいくつかのヘッダーが含まれているため、追加するたびに追加されます。

于 2011-12-21T15:18:52.227 に答える
1

圧縮ファイル (.png) を次々に追加しているため、結果のファイルを開くと、最初のビットでエンコードされたデータ (最初の行) が表示されます。エンコードされた画像ヘッダーにはエンコードされたコンテンツを構成するバイト数があり、デコーダーはエンドマーカーの後のファイル内の残りのデータを気にしないため、これも論理的です。

.png ファイルを別のファイルの最後にコピーしようとしましたが、ファイルを開くと、変更されていない最初の画像が表示されました。

于 2011-12-21T15:16:34.867 に答える