Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java文档图像缩放和旋转_Java_Image_Geometry - Fatal编程技术网

Java文档图像缩放和旋转

Java文档图像缩放和旋转,java,image,geometry,Java,Image,Geometry,我有不同尺寸的文档图像,我希望能够以以下方式高效地缩放和旋转它们(标准的“旋转”和“缩放”逻辑)。我该怎么做 图像高H像素,宽W像素。最初,它应该扩展到600像素宽。每次旋转时,面板的宽度和高度应交换,缩放图像应旋转90度。在每次缩放时,图像应按“比例”因子进行缩放 以下是我迄今为止在BufferedImage img上尝试的内容。。。生成的BuffereImage会缩放和旋转,但不会平移(旋转90度后在面板顶部居中): 啊哈!关键(JavaDoc让人困惑)是意识到在AffineTransfor

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

图像高H像素,宽W像素。最初,它应该扩展到600像素宽。每次旋转时,面板的宽度和高度应交换,缩放图像应旋转90度。在每次缩放时,图像应按“比例”因子进行缩放

以下是我迄今为止在
BufferedImage img
上尝试的内容。。。生成的BuffereImage会缩放和旋转,但不会平移(旋转90度后在面板顶部居中):

啊哈!关键(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);
}
啊哈!关键(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);
}

您可以在保持图像和自由旋转图像的纵横比以及固定的90度旋转的同时查看缩放效果…感谢程序员,我想我需要自由旋转图像,然后将其平移一段距离。请记住,旋转很有趣…尤其是在凌晨2点;)我已经更新了我的解决方案,包括用于自动缩放、旋转和翻译图像的文档化代码。我可以进一步改进吗?您可以在保持图像和自由旋转图像的纵横比的同时查看缩放效果,并进行固定的90度旋转…感谢程序员,我想我需要自由旋转图像,然后将其平移一段距离。请记住,旋转很有趣…尤其是在凌晨2点;)我已经更新了我的解决方案,包括用于自动缩放、旋转和翻译图像的文档化代码。我可以进一步改进吗?请注意,您可能更喜欢在仿射变换之前使用Java本机图像缩放(并在此处删除scale()调用),否则您将失去图像质量。请注意,您可能更喜欢在仿射变换之前使用Java本机图像缩放(并在此处删除scale()调用),否则,您将失去图像质量。