2010-12-18 3 views
3

특정 해상도의 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 이상으로 떨어지면 상관 없습니다. (덧셈에서 캐리 오버) , 나는 그것에 대해 정말로 관심있는 사람들이 있다는 것을 알고 있습니다.

+0

데이터 배열과 Graphics.drawImage를 사용하여 다운 사이징 코드를 게시하는 데주의하십시오. –

답변

3

여기에 최적의 방법으로 자바에서 썸네일을 생성에 아주 좋은 기사입니다 :

http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html

당신은 매개 변수를 렌더링/다른 스케일링을 지정하는 더 나은 결과를 얻을 수 있습니다.

Graphics2D g2 = (Graphics2D)g; 
    int newW = (int)(originalImage.getWidth() * xScaleFactor); 
    int newH = (int)(originalImage.getHeight() * yScaleFactor); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
         RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 
    g2.drawImage(originalImage, 0, 0, newW, newH, null); 
관련 문제