gpt4 book ai didi

Java文档图像缩放和旋转

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:51 25 4
gpt4 key购买 nike

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

图像的高度为 H 像素,宽度为 W 像素。最初,它应该缩放到 600 像素宽。每次旋转时,面板的宽度和高度应交换,并且缩放后的图像应旋转 90 度。每次缩放时,图像应按“scale”因子缩放。

这是我迄今为止在 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 令人困惑)是意识到在 AffineTransform、rotate() 和其他方法上变换的是矩阵,而不是图像!以下代码会自动运行!

/**
* 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);
}

关于Java文档图像缩放和旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19849670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com