2012-02-12 18 views
7

Я пытаюсь загрузить карту движения из PNG-изображения. Чтобы сохранить память после загрузки растрового изображения, я делаю что-то подобное.Растровые изображения ALPHA_8 и getPixel


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

Если я рисую mapBmp я могу увидеть карту, но когда я использую GetPixel() Я получаю всегда 0 (ноль).

Есть ли способ получить информацию ALPHA из растрового изображения, отличного от , с помощью getPixel()?

ответ

0

Я был в состоянии найти хороший и вроде чистый способ создания границ карты. Я создаю растровое изображение ALPHA_8 с самого начала. I нарисовать мою карту границ с путями. Затем я использую copyPixelsToBuffer() и передаю байты в ByteBuffer. Я использую буфер для «getPixels». Я думаю, что это хорошее решение, так как вы можете масштабировать или перемещать путь() и рисовать границу карты с желаемой шкалой разрешения экрана и без операций декодирования IO +. Bitmap.getPixel() бесполезен для ALPHA_8 растровых изображений, он всегда возвращает 0.

+0

Не могли бы вы привести пример того, как я могу извлечь «пиксели» «Растрового изображения» ALPHA_8'? Я всегда получаю 0 ... –

4

Кажется, ошибка Android при обработке ALPHA_8. Я также пробовал copyPixelsToBuffer, безрезультатно. Самое простое обходное решение - потратить много памяти и использовать ARGB_8888.

Issue 25690

1

Я нашел этот вопрос с Google, и я был в состоянии извлечь пиксели с помощью метода copyPixelsToBuffer() что Mitrescu Catalin кончался использование. Это то, что мой код выглядит как в случае, если кто-то считает, что это так:

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

Если вы кодирование для уровня 12 API или выше можно использовать getByteCount() вместо того, чтобы получить общее количество байт для распределения. Однако, если вы кодируете API 19 (KitKat), вы, вероятно, должны использовать вместо этого getAllocationByteCount().

0

Я разработал решение с библиотекой PNGJ, чтобы прочитать изображение из активов, а затем создать Bitmap с 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; 

} 

Я также инвертирую альфа-значения из-за моих конкретных потребностей. Этот код тестируется только для API 21.

Смежные вопросы