图像保持点位置的比例分辨率

时间:2016-11-25 08:17:50

标签: java math scale scaling calc

考虑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预计为x482除外。 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}

3 个答案:

答案 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,然后我想知道缩小图片中的一个点,哪个位置对应于原始图片中的那个点。我展示了一张我想做的图片。

Problem

然后,我得到了一张 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。