2012-04-01 21 views
5

Khi tôi đang sử dụng copyPixelsFromBuffer và copyPixelsToBuffer, bitmap không hiển thị như cùng một, tôi đã cố gắng bên dưới mã:New Bitmap Changed vào Copy Sử dụng đệm

Bitmap bm = BitmapFactory.decodeByteArray(a, 0, a.length); 
int[] pixels = new int[bm.getWidth() * bm.getHeight()]; 
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0,bm.getWidth(),bm.getHeight()); 

ByteBuffer buffer = ByteBuffer.allocate(bm.getRowBytes()*bm.getHeight()); 
bm.copyPixelsToBuffer(buffer);//I copy the pixels from Bitmap bm to the buffer 

ByteBuffer buffer1 = ByteBuffer.wrap(buffer.array()); 
newbm = Bitmap.createBitmap(160, 160,Config.RGB_565); 
newbm.copyPixelsFromBuffer(buffer1);//I read pixels from the Buffer and put the pixels  to the Bitmap newbm. 

imageview1.setImageBitmap(newbm); 
imageview2.setImageBitmap(bm); 

Tại sao bm Bitmap và newbm không hiển thị cùng một nội dung?

Trả lời

0

Trong mã của bạn, bạn đang sao chép pixel thành bitmap với định dạng RGB_565, trong khi bitmap gốc mà bạn nhận được pixel phải ở định dạng khác.

Vấn đề là rõ ràng ngay từ documentation của copyPixelsFromBuffer():

Các dữ liệu trong bộ đệm là không thay đổi trong bất kỳ cách nào (không giống như setPixels(), mà chuyển đổi từ 32bit unpremultipled để bất cứ điều gì định dạng gốc của bitmap

Vì vậy, hãy sử dụng cùng một định dạng bitmap hoặc sử dụng setPixels() hoặc vẽ bitmap ban đầu lên bit mới bằng cách sử dụng cuộc gọi Canvas.drawBitmap().

Cũng sử dụng bm.getWidth() & bm.getHeight() để chỉ định kích thước của bitmap mới thay vì mã hóa cứng là 160.

+0

BitmapFactory.Options opts = new Options(); opts.inPreferredConfig = Config.RGB_565; \t \t \t \t \t bm = BitmapFactory.decodeByteArray (a, 0, a.length, opts); Cấu hình bitmap gốc là RGB565, ngay cả khi tôi không đặt cấu hình, cấu hình mặc định là RGB565 ... – Hexor

+0

@Hexor Thực hiện các phương pháp khác được mô tả trong công việc trả lời của tôi? 'Newbm' trông khác như thế nào so với' bm'? –

+0

Kích thước không đúng và chất lượng rất thấp. Tôi đã tìm thấy một giải pháp cho chính mình như thế này, tạo ra một Bitmap gọi là originBm, và được gọi là phương thức giải mã của BitmapFactory để khởi tạo originBm (chỉ cần đảm bảo tham số có thể khởi tạo originBm ngay), sau đó tôi sử dụng newbm = originBm; newbm.copyPixelsFromBuffer (buffer1). Sau đó, newbm có thể hiển thị đúng. Tôi không biết lý do nào gây ra điều này, nhưng tôi nghĩ có thể khi sử dụng copyPixelsFromBuffer(), chúng ta bỏ lỡ một cái gì đó mà phương thức createBitmap() không thể cung cấp cho chúng ta. – Hexor