Как масштабировать изображения JPEG с нестандартным коэффициентом дискретизации в Java? - PullRequest
1 голос
/ 12 января 2010

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

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

оригинал и миниатюра: альтернативный текст 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;
}

(код предоставлен этой страницы )

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

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

1 Ответ

2 голосов
/ 12 января 2010

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

Создание приличных миниатюр на Java удивительно сложно. Вот подробное обсуждение .

...