Java: линия появляется при использовании AffineTransform для масштабирования изображения

У меня проблема с масштабированием изображения. Когда я использую следующий код для масштабирования изображения, он заканчивается линией внизу или справа от изображения.

double scale = 1;
if (scaleHeight >= scaleWidth) {
    scale = scaleWidth;
} else {
    scale = scaleHeight;
}
AffineTransform af = new AffineTransform();
af.scale(scale, scale);

AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage bufferedThumb = operation.filter(img, null);

Исходное изображение

введите здесь описание изображения

Масштабированное изображение

введите здесь описание изображения

Кто-нибудь знает, почему появляется строка?

Спасибо!

РЕДАКТИРОВАТЬ:

Добавлен полный код метода:

public static final int SPINNER_MAX_WIDTH = 105;
public static final int SPINNER_MAX_HEIGHT = 70;

public void scaleImage(BufferedImage img, int maxWidth, int maxHeight, String fileName) {
    double scaleWidth = 1;
    double scaleHeight = 1;

    if (maxHeight != NOT_SET) {
        if (img.getHeight() > maxHeight) {
            scaleHeight = (double) maxHeight / (double) img.getHeight();
        }
    }

    if (maxWidth != NOT_SET) {
        if (img.getWidth() > maxWidth) {
            scaleWidth = (double) maxWidth / (double) img.getWidth();
        }
    }

    double scale = 1;

    if (scaleHeight >= scaleWidth) {
        scale = scaleWidth;
    } else {
        scale = scaleHeight;
    }

    AffineTransform af = new AffineTransform();
    af.scale(scale, scale);

    AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
    BufferedImage bufferedThumb = operation.filter(img, null);

    if (bufferedThumb != null) {
        File imageFile = new File(fileName);
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
        try {
            ImageIO.write(bufferedThumb, fileType, imageFile);
        } catch (IOException e) {
            logger.error("Failed to save scaled image: " + fileName + "\n" + e.getMessage());
        }
    }
}

Параметры maxWidth и maxHeight в вызове метода устанавливаются в константы SPINNER_MAX_*.

Спасибо!


person Malakim    schedule 19.03.2010    source источник
comment
Я запустил ваш код (используя ваше изображение в качестве входных данных), и он выглядел нормально. Что вы используете для scaleWidth/scaleHeight? Как вы загружаете изображение? Как вы это показываете/сохраняете?   -  person Ash    schedule 20.03.2010
comment
Я добавил полный метод - спасибо.   -  person Malakim    schedule 21.03.2010


Ответы (1)


Можете ли вы дать нам остальную часть кода - как вы манипулируете bufferedThumb, потому что, если вы просто сохраните его в файл, все должно быть в порядке.

ImageIO.write(bufferedThumb, "PNG", new File("img.png"));

Какую версию java вы используете?

ОТРЕДАКТИРОВАНО:

Что вы можете попробовать, так это построить окончательное изображение явно следующим образом:

BufferedImage bufferedThumb = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB);
operation.filter(img, bufferedThumb);

чтобы убедиться, какой цветовой режим используется.

Я думаю, что ваша проблема может быть связана с этой ошибкой: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6725106

Другое дело, возможно, использовать другой тип интерполяции, например:

AffineTransformOp.TYPE_BILINEAR

Для получения дополнительной информации см.: http://www.dpreview.com/learn/?/key=interpolation

person fikovnik    schedule 19.03.2010
comment
Добавил полный метод - использую JDK 1.6.0_18. Спасибо. - person Malakim; 21.03.2010
comment
Вот, вероятно, и все, я попробую ваши предложения и посмотрю, решат ли они проблему. Спасибо! - person Malakim; 23.03.2010