2011-03-22 25 views
9

Khi xử lý một số bitmap trong Android, tôi nhận thấy rằng màu trắng được sử dụng trong chế độ xem không phải lúc nào cũng hiển thị màu trắng trên bitmap. Hãy xem xét ảnh chụp màn hình này.Trắng không trắng

enter image description here

Các nền trắng là từ một cái nhìn với màu nền trắng.

Mặt trước "trắng" là từ một bitmap trắng được giải mã từ thẻ SD, được hiển thị trong ImageView. bitmap này được giải mã bằng RGB_565 như sau:

BitmapFactory.Options resample = new BitmapFactory.Options(); 
resample.inPreferredConfig = Config.RGB_565; 
resample.inSampleSize = sampleSize; 
return BitmapFactory.decodeFile(filePath, resample); 

Để tham khảo, here 's bitmap.

Tại sao điều này và cách khắc phục?

+1

Bitmap trắng cần thiết là gì? Có thể đã sử dụng một loạt các dòng trống: P – Marlon

+1

Nhưng sau đó: tại sao quá lâu, hoặc tại sao không chỉ là một liên kết đến nó? – Arjan

+0

Được liên kết với bitmap thay vì đính kèm nó vào câu hỏi. – hpique

Trả lời

0

Có thể có sự khác biệt giữa loại hình ảnh và Bitmap mà ImageView hiển thị, xem Bitmap.Config. Tải hình ảnh của bạn ở các chế độ khác nhau và xem điều đó có giúp ích gì không. Hãy xem Bitmap quality and banding để biết thêm thông tin.

+0

Bạn có thể xây dựng thêm một chút không? Tôi đã thêm Bitmap.Config mà tôi đang sử dụng (RGB_565). – hpique

+0

Thử đặt cửa sổ và hình ảnh để sử dụng cùng chế độ RGB và xem điều gì sẽ xảy ra. Đặt hình ảnh như trên và cửa sổ với 'getWindow(). GetAttributes(). Format'. Hãy thử RGB_8888 và xem nó không phải màu trắng. Bạn có biết định dạng RGB của hình ảnh gốc của bạn là gì không? –

+0

No. Làm thế nào tôi có thể kiểm tra định dạng RGB của hình ảnh (được liên kết trong câu hỏi, BTW)? Tôi biết đó là RGB và độ sâu là 8, theo Mac OS X Preview. – hpique

3

Tôi có cùng vấn đề và sau một số thử nghiệm, tôi nhận thấy rằng nhận xét <uses-sdk> giải quyết được sự cố. Bất kỳ giá trị cho android:minSdkVersion trên 3 sẽ làm cho hiệu ứng này xuất hiện (loại bỏ <uses-sdk> thẻ một cách hiệu quả thay đổi minSdkVersion để 1.

+0

tiếc là điều này đã không làm việc cho tôi. – radhoo

+0

Điều này làm việc cho tôi, nhưng điều này làm hỏng bố trí máy tính bảng – VicVu

1

Đã có một rất giống nhau nếu không muốn nói chính xác cùng một vấn đề, thậm chí thiết lập inPreferredConfig để ARGB_8888 không giúp đỡ.

Từ những gì tôi có thể thu thập từ: http://android.nakatome.net/2010/04/bitmap-basics.html

vấn đề là Android tự động kết hợp hình ảnh 24 bit xuống 16 bit, điều này có thể gây rối với màu sắc. Liên kết đề cập đến bạn có thể vô hiệu hóa điều này bằng cách thêm kênh alpha vào hình ảnh của bạn hoặc tải nó từ thư mục thô thay vì như một nguồn tài nguyên.

Được xem là không phải trong số này là một lựa chọn cho tôi, tôi tìm thấy những điều sau đây cuối cùng đã thành công:

Paint ditherPaint = new Paint(); 
ditherPaint.setDither(true); 
canvas.drawBitmap(mDrawable.getBitmap(), null, 
        mDrawable.getBounds(), ditherPaint); 

Đây mDrawable là loại BitmapDrawable.

0

Đây là những gì giải quyết này cho tôi:

Bạn cần phải thiết lập mật độ màn hình để ngăn chặn nhà máy bitmap từ rescaling bitmap của bạn. Việc này được thực hiện bằng mã sau:

DisplayMetrics displayMetrics=new DisplayMetrics(); 
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
wm.getDefaultDisplay().getMetrics(displayMetrics); 
resample.inScreenDensity = displayMetrics.densityDpi; 
+0

Tùy chọn là gì? – VicVu

+1

Xin lỗi, điều này sẽ được tái định dạng như trong câu hỏi ban đầu. Nó là một thể hiện của BitmapFactory.Options mà sau đó được sử dụng làm tham số cho bitmapFactory.decode * -method. – ChristophK

2

Thử đặt getWindow().setFormat(PixelFormat.RGB_565) trong onCreate của bạn.

Định dạng mặc định dường như thay đổi dựa trên phiên bản SDK và loại thiết bị, do đó, chỉ cần buộc nó ở lại RGB_565