Спасибо за код на преобразовании в оттенки серого. Однако я заметил, что на устройствах 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;
}
(Если вы действительно не хотите использовать пространство данных класса, просто замените ИНТ [] с четырьмя отдельными локальными междунар переменные, которые будут жить в стеке)
Не являются ли изображения в оттенках серого, которые должны использовать только 8 бит на пиксель, без возможности прозрачности? вы пытаетесь превратить свой образ в 32-битный оттенки серого? вы можете отправить код преобразования цвета. –
Возможно, возможно извлечь альфа-слой и повторно применить его после преобразования оттенков серого? Это кажется более удобным, чем пиксельно-пиксельное преобразование. – Nyerguds