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

1 java image center rotation itext

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*/
Run Code Online (Sandbox Code Playgroud)

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

mkl*_*mkl 5

如果我们有Image image和 坐标x, y,我们可以在不旋转的情况下绘制图像,其左下角位于给定坐标,如下所示

\n\n
contentByte.addImage(image, image.getWidth(), 0, 0, image.getHeight(), x, y);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

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

( AddRotatedImage.java测试方法testAddRotatedImage

\n\n

例如使用绘制两个图像

\n\n
int x = 200;\nint y = 300;\nfloat rotate = (float) Math.PI / 3;\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是这样的:

\n\n

截屏

\n\n

带翻转

\n\n

OP 在评论中问道

\n\n
\n

如何添加旋转和翻转图像\xef\xbc\x9f

\n
\n\n

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

\n\n

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

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

( AddRotatedImage.java测试方法testAddRotatedFlippedImage

\n\n

与上面相同图像的结果:

\n\n

截屏

\n\n

带插值

\n\n

OP 在另一条评论中问道

\n\n
\n

如何抗锯齿?

\n
\n\n

iTextImage类知道一个Interpolation属性。通过将其设置为 true (之前显然,在将图像添加到文档

\n\n
image.setInterpolation(true);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

旋转插值图像.pdf 截图

\n\n

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

\n\n

注意: iTextImage属性Interpolation有效地设置插值PDF 图像字典中的PDF 规范在这方面做了注释:

\n\n
\n

注:符合要求的读者可以选择不实现 PDF 的此功能,或者可以使用其希望的任何特定插值实现。

\n
\n\n

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

\n