Rumah  >  Artikel  >  Java  >  Mengapa Tatasusunan Bait Saya Mengandungi Sifar Selepas Menukar Peta Bit Menggunakan copyPixelsToBuffer?

Mengapa Tatasusunan Bait Saya Mengandungi Sifar Selepas Menukar Peta Bit Menggunakan copyPixelsToBuffer?

Patricia Arquette
Patricia Arquetteasal
2024-11-06 15:45:02211semak imbas

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

Memelihara Data Bitmap dengan Penukaran Tatasusunan Byte

Manipulasi peta bit ialah tugas biasa dalam pembangunan Android, selalunya melibatkan penukaran peta bit kepada tatasusunan bait untuk penyimpanan atau penghantaran data. Walau bagaimanapun, sesetengah pembangun menghadapi kesukaran apabila cuba melakukan penukaran ini, membawa kepada soalan berikut:

S: Mengapa tatasusunan bait yang disalin diisi dengan sifar selepas menukar peta bit menggunakan copyPixelsToBuffer?

Coretan kod yang disediakan menunjukkan percubaan untuk menukar peta bit kepada tatasusunan bait menggunakan copyPixelsToBuffer, tetapi penimbal yang terhasil hanya mengandungi sifar. Untuk memahami punca isu ini, mari kita analisa kod:

  • Peta bit diperoleh daripada niat.
  • Saiznya dikira menggunakan bait tinggi dan baris bagi peta bit.
  • Satu ByteBuffer diperuntukkan dengan saiz yang dikira.
  • copyPixelsToBuffer digunakan untuk menyalin piksel bitmap ke dalam penimbal.
  • Suatu tatasusunan bait dengan saiz yang sama dibuat.
  • Penimbal diambil semula ke dalam tatasusunan bait.

Setelah pemeriksaan lanjut, menjadi jelas bahawa isu itu terletak pada kaedah copyPixelsToBuffer itu sendiri. Apabila menggunakan peta bit tidak berubah, ia tidak melakukan salinan piksel sebenar tetapi mengembalikan rujukan pendua. Oleh itu, sebarang pengubahsuaian seterusnya pada peta bit tidak akan ditunjukkan dalam penimbal yang disalin.

Penyelesaian: Kaedah Alternatif untuk Penukaran Peta Bit

Untuk menukar peta bit kepada tatasusunan bait dengan berkesan, kaedah alternatif mesti diambil bekerja. Satu pendekatan yang boleh dipercayai ialah memampatkan peta bit menggunakan format seperti PNG atau JPEG dan menyimpan data termampat dalam tatasusunan bait. Berikut ialah contoh:

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

Coretan kod ini mengikut langkah berikut:

  • Memampatkan peta bit ke dalam format PNG atau JPEG menggunakan ByteArrayOutputStream.
  • Mendapatkan data dimampatkan sebagai tatasusunan bait.
  • Mengeluarkan peta bit asal selepas penukaran selesai.

Ingat, data peta bit juga boleh diambil daripada tatasusunan bait menggunakan kelas BitmapFactory:

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

Atas ialah kandungan terperinci Mengapa Tatasusunan Bait Saya Mengandungi Sifar Selepas Menukar Peta Bit Menggunakan copyPixelsToBuffer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn