2012-02-12 26 views
7

Tôi đang cố tải bản đồ chuyển động từ hình ảnh PNG. Để tiết kiệm bộ nhớ sau khi tôi tải bitmap tôi làm một cái gì đó như thế.ALPHA_8 bitmap và getPixel


`Bitmap mapBmp = tempBmp.copy(Bitmap.Config.ALPHA_8, false);` 

Nếu tôi vẽ mapBmp tôi có thể xem bản đồ nhưng khi tôi sử dụng GetPixel() tôi nhận được luôn 0 (zero).

Có cách nào để truy xuất thông tin ALPHA từ bitmap khác với bằng getPixel() không?

Trả lời

0

tôi đã có thể tìm ra một cách tốt đẹp và loại sạch để tạo bản đồ ranh giới. Tôi tạo một bitmap ALPHA_8 ngay từ đầu. Tôi vẽ bản đồ giới hạn của tôi với đường dẫn. Sau đó, tôi sử dụng copyPixelsToBuffer() và chuyển byte thành một ByteBuffer. Tôi sử dụng bộ đệm để "getPixels" từ. Tôi nghĩ là một giải pháp tốt vì bạn có thể chia tỷ lệ lên hoặc lên đường dẫn() và vẽ bản đồ ranh giới ở tỷ lệ độ phân giải màn hình mong muốn và không có thao tác giải mã IO +. Bitmap.getPixel() vô dụng đối với các bitmap ALPHA_8, nó luôn trả về 0.

+0

Bạn có thể cung cấp ví dụ về cách tôi có thể trích xuất "pixel" của 'bitmap' '' '? Tôi luôn nhận được 0 ... –

4

Dường như là một lỗi Android trong việc xử lý ALPHA_8. Tôi cũng đã thử copyPixelsToBuffer, không có kết quả. Cách giải quyết đơn giản nhất là lãng phí nhiều bộ nhớ và sử dụng ARGB_8888.

Issue 25690

1

Tôi tìm thấy câu hỏi này từ Google và tôi có thể trích xuất các pixel bằng phương pháp copyPixelsToBuffer() mà Mitrescu Catalin đã sử dụng. Đây là những gì mã của tôi trông giống như trong trường hợp bất cứ ai khác tìm thấy này là tốt:

public byte[] getPixels(Bitmap b) { 
    int bytes = b.getRowBytes() * b.getHeight(); 
    ByteBuffer buffer = ByteBuffer.allocate(bytes); 
    b.copyPixelsToBuffer(buffer); 
    return buffer.array(); 
} 

Nếu bạn đang mã hóa cho cấp API 12 hoặc cao hơn, bạn có thể sử dụng getByteCount() thay vì để có được tổng số byte để phân bổ. Tuy nhiên nếu bạn đang mã hóa cho API cấp 19 (KitKat), bạn nên sử dụng getAllocationByteCount() để thay thế.

0

Tôi đã phát triển giải pháp với thư viện PNGJ, để đọc hình ảnh từ nội dung và sau đó tạo Bitmap bằng Config.ALPHA_8.

import ar.com.hjg.pngj.IImageLine; 
import ar.com.hjg.pngj.ImageLineHelper; 
import ar.com.hjg.pngj.PngReader; 

public Bitmap getAlpha8BitmapFromAssets(String file) { 

    Bitmap result = null; 

    try { 

     PngReader pngr = new PngReader(getAssets().open(file)); 
     int channels = pngr.imgInfo.channels; 
     if (channels < 3 || pngr.imgInfo.bitDepth != 8) 
      throw new RuntimeException("This method is for RGB8/RGBA8 images"); 

     int bytes = pngr.imgInfo.cols * pngr.imgInfo.rows; 
     ByteBuffer buffer = ByteBuffer.allocate(bytes); 

     for (int row = 0; row < pngr.imgInfo.rows; row++) { 

      IImageLine l1 = pngr.readRow(); 

      for (int j = 0; j < pngr.imgInfo.cols; j++) { 

       int original_color = ImageLineHelper.getPixelARGB8(l1, j); 

       byte x = (byte) Color.alpha(original_color); 

       buffer.put(row * pngr.imgInfo.cols + j, x ^= 0xff); 

      } 

     } 

     pngr.end(); 

     result = Bitmap.createBitmap(pngr.imgInfo.cols,pngr.imgInfo.rows, Bitmap.Config.ALPHA_8); 
     result.copyPixelsFromBuffer(buffer); 

    } catch (IOException e) { 
     Log.e(LOG_TAG, e.getMessage()); 
    } 

    return result; 

} 

Tôi cũng đảo ngược giá trị alpha, vì nhu cầu cụ thể của tôi. Mã này chỉ được thử nghiệm cho API 21.