繁体   English   中英

Java文档图像缩放和旋转

[英]Java document image scaling and rotation

我有不同尺寸的文档图像,并且希望能够以以下方式(标准“旋转”和“缩放”逻辑)有效缩放和旋转它们。 我该怎么做?

图像的高度为H像素,宽度为W像素。 最初,它应该缩放到600像素宽。 每次旋转时,面板的宽度和高度应互换,缩放的图像应旋转90度。 每次缩放时,图像应按“比例”比例缩放。

到目前为止,这是我在BufferedImage img上尝试过的方法...生成的BufferedImage缩放并旋转但不平移(在旋转90度后居中于面板顶部):

double scale = zoom * 600.0 / img.getWidth();
rotation = (rotation + degrees) % 360;
int scaledWidth = (int)(scale * img.getWidth());
int scaledHeight = (int)(scale * img.getHeight());
BufferedImage bufferedImage = new BufferedImage(scaledWidth, scaledHeight, img.getType());
if (rotation % 180 == 0)
    bufferedImage = new BufferedImage(scaledWidth, scaledHeight, img.getType());
else
    bufferedImage = new BufferedImage(scaledHeight, scaledWidth, img.getType());

AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(rotation), scaledWidth/2, scaledHeight/2);
transform.scale(scale, scale);
AffineTransformOp operation = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
scaledImage = operation.filter(img, bufferedImage);
imagePanel.setPreferredSize(new Dimension(bufferedImage.getWidth(), bufferedImage.getHeight()));

啊哈! 关键(JavaDoc令人困惑)是意识到在AffineTransformrotate()和其他方法可以转换矩阵,而不是图像! 以下代码可以自动运行!

/**
 * Transforms the image efficiently without losing image quality.
 * Scales the image to a width of (600 * scale) pixels, rotates the image,
 * and translates (moves) the image to recenter it if rotated 90 or 270 degrees.
 */
protected BufferedImage transformImage(BufferedImage image)
{
    int scaledWidth = (int)(scale * image.getWidth());
    int scaledHeight = (int)(scale * image.getHeight());

    // Methods AffineTransform.rotate(), AffineTransform.scale() and AffineTransform.translate()
    // transform AffineTransform's transformation matrix to multiply with the buffered image.
    // Therefore those methods are called in a counterintuitive sequence.
    AffineTransform transform;
    if (rotation % 180 == 0)
    {
        // First scale and second rotate image
        transform = AffineTransform.getRotateInstance(Math.toRadians(rotation), scaledWidth/2, scaledHeight/2);
        transform.scale(scale, scale);
    }
    else
    {
        // First scale, second rotate, and third translate image
        transform = AffineTransform.getTranslateInstance((scaledHeight-scaledWidth)/2, (scaledWidth-scaledHeight)/2);
        transform.rotate(Math.toRadians(rotation), scaledWidth/2, scaledHeight/2);
        transform.scale(scale, scale);
    }
    AffineTransformOp operation = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC);
    BufferedImage transformedImage = operation.createCompatibleDestImage(image, image.getColorModel());
    return operation.filter(image, transformedImage);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM