如何在Java中使用非标准采样因子缩放JPEG图像?

时间:2010-01-12 14:43:59

标签: java image-processing jpeg awt image-scaling

我正在使用Java AWT缩放JPEG图像,以创建缩略图。当图像具有正常采样因子(2x2,1x1,1x1)

时,代码可以正常工作

但是,具有此采样系数(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]。

1 个答案:

答案 0 :(得分:2)

我认为问题不在于缩放,而是在构建BufferedImage时使用不兼容的颜色模型(“图像类型”)。

用Java创建体面的缩略图非常困难。这是一个detailed discussion