如何通过itext围绕图像中心旋转?

Posted

技术标签:

【中文标题】如何通过itext围绕图像中心旋转?【英文标题】:How to rotate around the image center by itext? 【发布时间】:2017-01-14 19:23:33 【问题描述】:
double degPi = degrees * Math.PI / 180;   
double a = Math.cos(degPi)*tImgCover.getScaledHeight();
double b = Math.sin(degPi)*tImgCover.getScaledWidth();
double c = -Math.sin(degPi) * tImgCover.getScaledHeight();
double d = Math.cos(degPi)* tImgCover.getScaledWidth();
double e = absX;
double f = absY;

contentByte.addImage(imgae, a, b, c, d, e, f);/*add image*/

【问题讨论】:

tImgCover 是图像参考 【参考方案1】:

如果我们有一个Image image 和坐标x, y,我们可以像这样在给定坐标处绘制左下角不旋转的图像

contentByte.addImage(image, image.getWidth(), 0, 0, image.getHeight(), x, y);

资源中的位图图像大小为 1x1,坐标原点位于其左下方。因此,此操作会将图像拉伸到正确的大小并移动它,使其左下角位于给定的坐标处。

如果我们想要绘制相同的图像,就好像上面绘制的图像围绕其中心旋转了一个角度rotate,因此,我们可以通过移动 1x1 图像以使原点位于其中心来做到这一点,拉伸将其调整到正确的大小,旋转它,然后将原点(仍位于旋转图像的中心)移动到未旋转图像的中心。这些操作使用AffineTransform 实例(来自包com.itextpdf.awt.geom)而不是数字元组更容易表达。因此:

// Draw image as if the previous image was rotated around its center
// Image starts out being 1x1 with origin in lower left
// Move origin to center of image
AffineTransform A = AffineTransform.getTranslateInstance(-0.5, -0.5);
// Stretch it to its dimensions
AffineTransform B = AffineTransform.getScaleInstance(image.getWidth(), image.getHeight());
// Rotate it
AffineTransform C = AffineTransform.getRotateInstance(rotate);
// Move it to have the same center as above
AffineTransform D = AffineTransform.getTranslateInstance(x + image.getWidth()/2, y + image.getHeight()/2);
// Concatenate
AffineTransform M = (AffineTransform) A.clone();
M.preConcatenate(B);
M.preConcatenate(C);
M.preConcatenate(D);
//Draw
contentByte.addImage(image, M);

(AddRotatedImage.java测试方法testAddRotatedImage)

例如使用

绘制两个图像
int x = 200;
int y = 300;
float rotate = (float) Math.PI / 3;

结果如下:

翻盖

OP 在评论中询问

如何添加旋转和翻转图片?

为此,您只需将镜像仿射变换插入到上述变换序列中。

不幸的是,OP 没有提到他的意思是水平翻转还是垂直翻转。但是,由于改变旋转角度会相应地改变一个,这也不是必需的。

// Draw image as if the previous image was flipped and rotated around its center
// Image starts out being 1x1 with origin in lower left
// Move origin to center of image
AffineTransform A = AffineTransform.getTranslateInstance(-0.5, -0.5);
// Flip it horizontally
AffineTransform B = new AffineTransform(-1, 0, 0, 1, 0, 0);
// Stretch it to its dimensions
AffineTransform C = AffineTransform.getScaleInstance(image.getWidth(), image.getHeight());
// Rotate it
AffineTransform D = AffineTransform.getRotateInstance(rotate);
// Move it to have the same center as above
AffineTransform E = AffineTransform.getTranslateInstance(x + image.getWidth()/2, y + image.getHeight()/2);
// Concatenate
AffineTransform M = (AffineTransform) A.clone();
M.preConcatenate(B);
M.preConcatenate(C);
M.preConcatenate(D);
M.preConcatenate(E);
//Draw
contentByte.addImage(image, M);

(AddRotatedImage.java测试方法testAddRotatedFlippedImage)

与上图相同的结果:

带插值

OP 在另一条评论中询问

如何抗锯齿?

iText Image 类知道 Interpolation 属性。通过将其设置为 true(显然, 将图像添加到文档中),

image.setInterpolation(true);

低分辨率图像在绘制时会进行插值。

例如使用具有不同颜色像素的 2x2 图像而不是 Willi 的图像,您会得到以下结果,首先没有插值,然后使用插值:

授予AddRotatedImage.java 测试testAddRotatedInterpolatedImage 添加此图像:

注意: iText Image 属性 Interpolation 有效地设置 PDF 图像字典中的 Interpolate 条目。在此上下文中的 PDF 规范说明:

注意,符合标准的阅读器可以选择不实现 PDF 的此功能,或者可以使用它希望的任何特定的插值实现。

因此,在某些查看器中,插值的发生可能与您的查看器不同,甚至可能根本没有。如果您需要对每个查看器进行特定类型的插值,请在将图像加载到 iText Image 之前使用所需的插值/抗锯齿量来放大图像。

【讨论】:

你好,如何添加旋转和翻转图像? 如何抗锯齿? 嗨,mkl,如何添加苹果表情符号? 谁是苹果表情符号? 加载字体,使用字体绘制文本。但这绝对与这里的问题和答案无关,因此请自行提出问题。【参考方案2】:
    public static BufferedImage rotateClockwise90( BufferedImage inputImage )
        int width = inputImage.getWidth();
        int height = inputImage.getHeight();
        BufferedImage returnImage = new BufferedImage( height, width , inputImage.getType()  );

        for( int x = 0; x < width; x++ ) 
            for( int y = 0; y < height; y++ ) 
                returnImage.setRGB( height-y-1, x, inputImage.getRGB( x, y  )  );

            
        
        return returnImage;

【讨论】:

试试上面的例子,将图像顺时针旋转 90 度。 如何将图片顺时针旋转0-360度? 使用 itext api!!

以上是关于如何通过itext围绕图像中心旋转?的主要内容,如果未能解决你的问题,请参考以下文章

颤动 - 如何使用画布围绕中心旋转图像

如何在 Pygame 中围绕偏离中心的枢轴旋转图像

Pygame,围绕中心旋转使图像消失

无法在openGL中围绕它的中心旋转我的图像

如何在Android中旋转位图,使图像中心平滑,无振荡运动

如何通过底部中心旋转图像?