2010-03-09 16 views
1

есть ли возможность в J2ME конвертировать изображение (загруженное из файла png с альфой) в новое прозрачное полутоновое изображение?J2ME: преобразовать прозрачное изображение PNG в оттенки серого

До сих пор я получил только значения rgb, но не альфа.

Спасибо.

Редактировать: да, это должно быть 32-битный оттенок серого.

+0

Не являются ли изображения в оттенках серого, которые должны использовать только 8 бит на пиксель, без возможности прозрачности? вы пытаетесь превратить свой образ в 32-битный оттенки серого? вы можете отправить код преобразования цвета. –

+0

Возможно, возможно извлечь альфа-слой и повторно применить его после преобразования оттенков серого? Это кажется более удобным, чем пиксельно-пиксельное преобразование. – Nyerguds

ответ

4

Я нашел решение, и вот код:

public Image getGrayScaleImage() { 
    int[] rgbData = new int[getWidth() * getHeight()]; 
    image.getRGB(rgbData, 0, getWidth(), 0, 0, getWidth(), getHeight()); 
    for (int x = 0; x < getWidth() * getHeight(); x++) { 
     rgbData[x] = getGrayScale(rgbData[x]); 
    } 
    Image grayImage = Image.createRGBImage(rgbData, getWidth(), getHeight(), true); 
    return grayImage; 
} 

private int getGrayScale(int c) { 
    int[] p = new int[4]; 
    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level 
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level 
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level 
    p[3] = (int) (c & 0x000000FF); // Blue level 

    int nc = p[1]/3 + p[2]/3 + p[3]/3; 
    // a little bit brighter 
    nc = nc/2 + 127; 

    p[1] = nc; 
    p[2] = nc; 
    p[3] = nc; 

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]); 
    return gc; 
} 

getRGB возвращает значение цвета, которое также включает в себя альфа-канал. Поэтому мне нужно было изменить каждое значение в массиве и создать образ из этого.

Я нашел полезный документ в Nokia форуме: MIDP 2.0: Working with Pixels and drawRGB()

0

Спасибо за код на преобразовании в оттенки серого. Однако я заметил, что на устройствах Nokia Series 40 этот код работает довольно медленно.

Есть 2 оптимизаций. Главное - удалить любое создание объекта в getGrayScale(). В настоящее время объект массива создается для каждого пикселя. В среднем, скажем, QVGA, отображается, что создано 76800 объектов массива, что много мусора и, вероятно, вызовет GC. Определение int [4] как поля в классе удаляет это создание объекта. Компромиссом здесь является небольшое количество дополнительной памяти, используемой для класса.

Второй способ заключается в кешировании ширины и высоты в getGrayScaleImage(). На некоторых устройствах метод вызывает getWidth(), а getHeight() будет повторно вызываться без оптимизаций (компилятор JIT будет в порядке, но некоторые интерпретируемые устройства не будут). Итак, снова для QVGA, getWidth() и getHeight() будут называться несколько> 150000 между ними.

В целом, я нашел, что это модифицированная версия работала гораздо быстрее :-)

public Image getGrayScaleImage(Image screenshot) { 
    int width = getWidth(); 
    int height = getHeight(); 
    int screenSizeInPixels = (width * height); 

    int[] rgbData = new int[width * height]; 

    image.getRGB(rgbData, 0, width, 0, 0, width, height); 
    for (int x = 0; x < screenSizeInPixels ; x++) { 
     rgbData[x] = getGrayScale(rgbData[x]); 
    } 

    Image grayImage = Image.createRGBImage(rgbData, width, height, true); 
    return grayImage; 
} 

static int[] p = new int[4]; 
private int getGrayScale(int c) { 

    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level 
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level 
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level 
    p[3] = (int) (c & 0x000000FF); // Blue level 

    int nc = p[1]/3 + p[2]/3 + p[3]/3; 
    // a little bit brighter 
    nc = nc/2 + 127; 

    p[1] = nc; 
    p[2] = nc; 
    p[3] = nc; 

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]); 
    return gc; 
} 

(Если вы действительно не хотите использовать пространство данных класса, просто замените ИНТ [] с четырьмя отдельными локальными междунар переменные, которые будут жить в стеке)

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

  • Нет связанных вопросов^_^