Спасибо за код для преобразования в оттенки серого. Однако я заметил, что на устройствах 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;
}
(Если вы действительно не хотите использовать пространство данных класса, просто замените int [] четырьмя отдельными локальными переменными int, которые будут жить в стеке)