ホームページ  >  記事  >  Java  >  copyPixelsToBuffer を使用してビットマップを変換した後、バイト配列にゼロが含まれるのはなぜですか?

copyPixelsToBuffer を使用してビットマップを変換した後、バイト配列にゼロが含まれるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-06 15:45:02211ブラウズ

Why Does My Byte Array Contain Zeros After Converting a Bitmap Using copyPixelsToBuffer?

バイト配列変換によるビットマップ データの保持

ビットマップ操作は Android 開発における一般的なタスクであり、多くの場合、データの保存または送信のためにビットマップをバイト配列に変換することが含まれます。ただし、一部の開発者はこの変換を実行しようとすると問題が発生し、次のような疑問が生じます:

Q: copyPixelsToBuffer を使用してビットマップを変換した後、コピーされたバイト配列がゼロで埋められるのはなぜですか?

提供されたコード スニペットは、copyPixelsToBuffer を使用してビットマップをバイト配列に変換する試みを示していますが、結果のバッファーにはゼロのみが含まれます。この問題の原因を理解するために、コードを分析してみましょう。

  • ビットマップはインテントから取得されます。
  • そのサイズは、ビットマップの高さと行バイトを使用して計算されます。
  • 計算されたサイズで ByteBuffer が割り当てられます。
  • copyPixelsToBuffer が呼び出され、ビットマップ ピクセルがバッファにコピーされます。
  • 同じサイズのバイト配列が作成されます。
  • バッファはバイト配列に取得されます。

さらに詳しく調べると、問題が copyPixelsToBuffer メソッド自体にあることが明らかになります。不変ビットマップを使用する場合、実際のピクセルのコピーは実行されませんが、重複した参照が返されます。したがって、ビットマップに対する後続の変更は、コピーされたバッファには反映されません。

解決策: ビットマップ変換の代替方法

ビットマップをバイト配列に効果的に変換するには、代替方法を使用します。雇用されなければなりません。信頼できるアプローチの 1 つは、PNG や JPEG などの形式を使用してビットマップを圧縮し、圧縮されたデータをバイト配列に格納することです。次に例を示します。

Bitmap bmp = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
bmp.recycle();

このコード スニペットは次の手順に従います。

  • ByteArrayOutputStream を使用してビットマップを PNG または JPEG 形式に圧縮します。
  • バイト配列として圧縮されたデータ。
  • 変換が完了したら、元のビットマップを解放します。

ビットマップ データは、BitmapFactory クラスを使用してバイト配列から取得することもできます。

BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

以上がcopyPixelsToBuffer を使用してビットマップを変換した後、バイト配列にゼロが含まれるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。