특정 해상도의 RGB 픽셀 값을 Java에로드 할 수 있어야합니다. 그 해상도는 작습니다 (~ 300x300).섬네일 픽셀 값을 Java에로드하는 가장 빠른 방법
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과의 '변환'와 다운 사이즈 할 수있는 실현하고 그런 식으로 다운 크기의 버전을로드 :
샘 그래서 여기있다, 다운 사이징 코드 요청 . 이렇게하면 추가로 33 %가 절약됩니다.
더 좋은 방법이 있다면 궁금합니다.
편집 : 일부 사람들은 내 코드가 일반적으로 좋은 것인지 궁금해하고 대답은 '아니오'라는 것을 알았습니다. 이미 작은 크기의 이미지 (640x480, 그렇지 않으면 .getRGB()가 영원히 필요함)를 다운 크기로 만들기 때문에 색상 점수가 2 이상으로 떨어지면 상관 없습니다. (덧셈에서 캐리 오버) , 나는 그것에 대해 정말로 관심있는 사람들이 있다는 것을 알고 있습니다.
데이터 배열과 Graphics.drawImage를 사용하여 다운 사이징 코드를 게시하는 데주의하십시오. –