考虑821, 435
像素图像上坐标1920, 1017
处的点,降落在其中间的某处。现在,将图像缩小到1243, 633
像素大。显然,我们的观点不再是那些坐标,而是随着图像缩小。我如何计算新点的坐标是什么?
以下假设为originalX = 1920
& newX = 1243
我们现在正在解决第一个值x
(最终为y
进行扩展)
我已完成newX/originalX
获取0.64739583
我可以用来originalX * 0.64739583
并获取1243
,表示newX
是{{1} } 64.739583%
。现在,回到我们之前的观点originalX
,821。新点x
预计为x
,482
除外。 originalX * 0.64739583 = 531
不是482
,因此点数不会匹配,因为它们的缩放率为531
正确的计算是什么(如果这些描述的计算甚至是错误的,并且图片的某些部分是错误缩放的),那么能够获得缩放点的新坐标?
缩放之前/之后的一些点的例子:
64.7
old = {width=1920, x=1807, y=996}, new = {width=1280, x=1167, y=698}
old = {width=1920, x=1178, y=814}, new = {width=1280, x=1138, y=516}
答案 0 :(得分:0)
如果确实发生了这样的位置,那么缩放就不像
那样是线性的NewX = X * NewWidth / OldWidth
相反,我看到下一个:没有缩放,但在保持中心位置的同时移动图像
middle of 1920 = 960
960 - 821 = 139
middle of 1243 = 621
621 - 482 = 139 !
所以转换法看起来像(我不能以单个例子声称它)
NewX = NewWidth/2 + (OldX - OldWidth/2)
答案 1 :(得分:0)
您的数学是错误的。您说:“新点的x预期为482,除了originalX * 0.64739583 =531。” 新点的x实际上是532(四舍五入)。您不会提供有关为什么newPointX预期为482,而originalX * 0.64739583 = 1243的信息。关于如何“计算新点的坐标”,请参见下面的代码。
int originalX = 1920;
int originalY = 1017;
int newX = 1243;
int newY = 633;
double scaleX = (double)newX/originalX;
double scaleY = (double)newY/originalY;
Point originalPoint = new Point(821, 435);
方法:
Point calculateNewPoint(Point originalPoint, double pScaleX, double pScaleY) {
return new Point((int)Math.round(pScaleX*originalPoint.x), (int)Math.round(pScaleY*originalPoint.y));
}
从第一段中得出的结果是返回点(532,271)。
答案 2 :(得分:0)
我必须解决类似的问题。我有一张 1920x1080 像素的图片,我想将该图片缩小 1.3,然后我想知道缩小图片中的一个点,哪个位置对应于原始图片中的那个点。我展示了一张我想做的图片。
然后,我得到了一张 1477x831 的缩小图片,因为 (1920/1.3, 1080/1.3)。如果原图有一个点在位置 (250,300),我缩小了图片,缩小后的图片中的新点,它将在位置 (192,231),因为 (250/1.3 , 300/1.3)是 (192,231)。然后,如果我缩小图片并得到点(192,231)并且我想获得原始图片中的位置,我只需要做(192 x 1.3 ,231 x 1.3)就是(250,300)。我们可以使用我们想要的缩放因子,我使用的是1.3,但我们可以使用2,将图片缩小到一半。
我分享了代码。
private double factorScale = 1.3;
private void formMouseClicked(java.awt.event.MouseEvent evt) {
int x = evt.getX(); // x = 192
int y = evt.getY(); // y = 231
int xWithOutScaled = (int) (factorScale * x); // xWithOutScaled = 250
int yWithOutScaled = (int) (factorScale * y); // yWithOutScaled = 300
}
private void printImage(int positionImage) {
java.awt.image.BufferedImage image = null;
File file = new File[pathImage];
try{
image = ImageIO.read(file);
}catch(IOException ie){
javax.swing.JOptionPane.showMessageDialog(this,"Error reading image file","Error",javax.swing.JOptionPane.ERROR_MESSAGE);
}
int widthScaled = (int) (width / factorScale); // widthScaled= 1477 ,width = 1920
int heightScaled = (int) (height / factorScale); // heightScaled=831 ,height = 1080
Image img = image.getScaledInstance(widthScaled,heightScaled,java.awt.Image.SCALE_SMOOTH);
ImageIcon newIcon = new ImageIcon(img);
this.image.setIcon(newIcon);
}
在您的情况下,您必须计算缩放的因子,即 (1920/1243) = 1.54 和 (1017/633)=1.60,在您的情况下,x 和 y 中的比例不同,因为选择的缩小图像的大小,但如果我们只在 x.原始图片中位置821的点,在缩小图片中的位置是533(821/1.54)。同理,我们可以计算出在原图(533* x 1.54)中的位置为821。