2010-01-12 4 views
1

Я использую Java AWT для масштабирования изображения JPEG, для создания эскизов. Код работает нормально, если изображение имеет нормальный коэффициент выборки (2x2,1x1,1x1)Как масштабировать изображения JPEG с нестандартным коэффициентом выборки в Java?

Однако изображение с таким коэффициентом выборки (1x1, 1x1, 1x1) создает проблему при масштабировании. Цвета повреждаются, хотя функции распознаются.

original и миниатюра: alt text http://otherplace.in/thumb1.jpg

код, я использую это примерно эквивалентно:

static BufferedImage awtScaleImage(BufferedImage image, 
            int maxSize, int hint) { 
    // We use AWT Image scaling because it has far superior quality 
    // compared to JAI scaling. It also performs better (speed)! 
    System.out.println("AWT Scaling image to: " + maxSize); 
    int w = image.getWidth(); 
    int h = image.getHeight(); 
    float scaleFactor = 1.0f; 
    if (w > h) 
     scaleFactor = ((float) maxSize/(float) w); 
    else 
     scaleFactor = ((float) maxSize/(float) h); 
    w = (int)(w * scaleFactor); 
    h = (int)(h * scaleFactor); 
    // since this code can run both headless and in a graphics context 
    // we will just create a standard rgb image here and take the 
    // performance hit in a non-compatible image format if any 
    Image i = image.getScaledInstance(w, h, hint); 
    image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = image.createGraphics(); 
    g.drawImage(i, null, null); 
    g.dispose(); 
    i.flush(); 
    return image; 
} 

(код любезно this page)

Есть ли лучший способ сделать это?

Вот test image с коэффициентом выборки [1x1, 1x1, 1x1].

+0

Я видел этот эффект при использовании 'ImageIO' для кодирования * полупрозрачного * изображения в формате JPEG, но я не думаю, что это относится к вашему примеру, поскольку ваше выходное изображение непрозрачно (' TYPE_INT_RGB'.) Является ли этот код образец завершен или есть другая пост-обработка, применяемая к изображению? Возможно непреднамеренное создание полупрозрачного изображения (например, 'AffineTransformOp' с' TYPE_BILINEAR 'добавит альфа-канал для сглаживания края полученного изображения, если он не лежит на точной границе пикселя.) – finnw

ответ

2

Я считаю, что проблема связана не с масштабированием, а с использованием несовместимой цветовой модели («тип изображения») при построении BufferedImage.

Создание достойных миниатюр в Java удивительно сложно. Вот detailed discussion.

+0

Я читал это обсуждение, и я использую некоторые из этих методов для более быстрого масштабирования. Но это не похоже на мою проблему. Но да, несовместимая цветовая модель - возможный подозреваемый на этапе загрузки изображения. Я использую 'javax.imageio.ImageIO.read' для загрузки изображения в память. Возможно, он не поддерживает аномальные коэффициенты выборки. – HRJ