我正在尝试在另一张图片上绘制图像。我有图像的大小,变换和原点。我的代码显示正确的大小和变换角度,但不是正确的点。
代码:
CREATE TABLE TEST(
NUMERO VARCHAR(100),
NUMEROWSN VARCHAR(100),
NOEUDADRESS VARCHAR(100),
PACKETRECE VARCHAR(100),
NOEUDSRECE VARCHAR(100),
HELLO VARCHAR(100)
) AS SELECT * FROM CSVREAD('C:\\ECLIPSE\\WORKSPACE\\H2\\DATA.CSV')
水印图像应该像这样放置:
但目前看起来像这样:
我错过了什么?
提前致谢
修改
x,y是边界框的边缘
答案 0 :(得分:2)
您的代码没有显示watermarkImageView.transform
是什么,这很重要,因为当您连续转换时,先前转换的效果也会影响以下所有转换。
E.g。将对象沿x轴移动10个像素的平移将使对象向右移动10个像素。但是,如果您首先进行旋转,将对象旋转45度,然后添加沿x轴移动10个像素的平移,则对象将不会向右移动10个像素,它将沿着一条线移动10个像素旋转45度,这意味着它将向上移动约7个像素,向右移动7个像素。这是因为旋转并不真正旋转对象本身,它实际上旋转了整个坐标系,导致对象被旋转。
看到这张图片:
最初,平移坐标系(红线)匹配"真实坐标"系统。但是在旋转45度后,平移坐标系已经旋转,现在在红线上平移会对角线移动物体。
想一张纸和一张邮票。印章始终具有相同的位置和相同的方向,您无法移动或旋转印章。但是你可以在邮票下方移动和旋转纸张!这就是你的转型所做的事情。它们在压印之前变换纸张。
对于大多数人来说,很难想象改变整个空间的效果,他们更容易想到改变对象。诀窍是:你必须以与编写它们相反的顺序阅读你的转换。我想你想要做的事实上是:
CGContextTranslateCTM(context, x, y);
CGContextConcatCTM(context, watermarkImageView.transform);
CGContextTranslateCTM(context,
-watermarkImageView.size.with * 0.5,
-watermarkImageView.size.height * 0.5
);
现在以相反的顺序(从下到上)阅读它们。首先,将水印向上移动(0,0),将其移动到高度的一半,然后将宽度的一半移动。现在,水印的中心正好是(0,0)。然后根据需要旋转它。最后,将其移动到所需位置。当然,你反过来编写了所有的转换,但这只是因为你正在改变坐标空间,而不是对象。
旋转前将水印居中非常重要,因为旋转始终围绕(0,0)坐标旋转。如果您只是旋转,则旋转如下所示:
这不是你想要的,因为它不仅会旋转物体,还会改变它的位置。如果您首先将图像居中(0,0),则旋转看起来像这样:
答案 1 :(得分:1)
我的问题的答案是
我必须翻译到我想要绘制上下文的中心。
CGContextTranslateCTM(context, imageView.center.x, imageView.center.y);
然后旋转上下文。
CGFloat angle = [(NSNumber *)[imageView valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
CGContextRotateCTM(context, angle);
然后画出
[imageView.image drawInRect:CGRectMake(-width * 0.5f, -height * 0.5f, width, height)];