Мне нужно иметь возможность загружать значения пикселей RGB с определенным разрешением в Java. Это разрешение небольшое (~ 300х300).
В настоящее время я загружаю их так:
File file = new File("...path...");
BufferedImage imsrc = ImageIO.read(file);
int width = imsrc.getWidth();
int height = imsrc.getHeight();
int[] data = new int[width * height];
imsrc.getRGB(0,0, width, height, data, 0, width);
и затем уменьшаю его сам.
Сэм попросил код для уменьшения размера, вот он:
/**
* DownSize an image.
* This is NOT precise, and is noisy.
* However, this is fast and better than NearestNeighbor
* @param pixels - _RGB pixel values for the original image
* @param width - width of the original image
* @param newWidth - width of the new image
* @param newHeight - height of the new image
* @return - _RGB pixel values of the resized image
*/
public static int[] downSize(int[] pixels, int width, int newWidth, int newHeight) {
int height = pixels.length / width;
if (newWidth == width && height == newHeight) return pixels;
int[] resized = new int[newWidth * newHeight];
float x_ratio = (float) width / newWidth;
float y_ratio = (float) height / newHeight;
float xhr = x_ratio / 2;
float yhr = y_ratio / 2;
int i, j, k, l, m;
for (int x = 0; x < newWidth; x ++)
for (int y = 0; y < newHeight; y ++) {
i = (int) (x * x_ratio);
j = (int) (y * y_ratio);
k = (int) (x * x_ratio + xhr);
l = (int) (y * y_ratio + yhr);
for (int p = 0; p < 3; p ++) {
m = 0xFF << (p * 8);
resized[x + y * newWidth] |= (
(pixels[i + j * width] & m) +
(pixels[k + j * width] & m) +
(pixels[i + l * width] & m) +
(pixels[k + l * width] & m) >> 2) & m;
}
}
return resized;
}
Недавно я понял, что могу уменьшить размер с помощью ImageMagick 'convert' и затем загрузить уменьшенную версию таким образом. Это экономит дополнительно 33%.
Мне было интересно, есть ли еще лучший способ.
РЕДАКТИРОВАТЬ: Я понял, что некоторые люди будут задаваться вопросом, если мой код в целом хорош, и ответ НЕТ. Код, который я использовал, хорошо работает для меня, потому что я уменьшаю размер уже небольших изображений (скажем, 640x480, в противном случае .getRGB () занимает вечно), и мне все равно, если пара цветных точек перетечет (перенос от добавления) и я знаю, что некоторых людей это волнует.