【问题标题】:Scale resolution of image keeping point locations图像保持点位置的比例分辨率
【发布时间】:2016-11-25 08:17:49
【问题描述】:

考虑1920, 1017 像素图像上坐标821, 435 处的点,该点落在它的中间某处。现在,将图像缩小到1243, 633 像素大。显然,我们的点不再在那些坐标上,而是随着图像一起缩小。我将如何计算新点的坐标?

对于以下假设 originalX = 1920newX = 1243 并且我们现在正在求解第一个值 x(最终为 y 进行缩放)

我已经完成了newX/originalX 以获得0.64739583,我可以使用它来执行originalX * 0.64739583 并获得1243,表明newX64.739583%originalX。现在,回到我们之前的点x,821。新点的x 预计是482,除了originalX * 0.64739583 = 531482 不是 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}
  • old = {width=1920, x=5, y=831}, new = {width=1517, x=5, y=693}

【问题讨论】:

  • x is expected to be 482 - 预计是谁?
  • @MBo 该点是图像中图形用户界面的一个特定点,位于直接中心并略微偏移——它是程序的屏幕截图。 x 预期为 482 是更改程序分辨率的结果(在这种情况下,将其从最大化中取出),使其分辨率更小。 821 是未最大化之前的x482 是之后。

标签: java math scale scaling calc


【解决方案1】:

如果这样的位置真的发生了,那么缩放就不是线性的了

NewX = X * NewWidth / OldWidth

相反,我看到了下一个:没有缩放,而是在保持中心位置的同时移动图像

middle of 1920 = 960
960 - 821 = 139
middle of 1243 = 621
621 - 482 = 139 !

所以转换定律看起来像(我不能仅举一个例子)

NewX = NewWidth/2 + (OldX - OldWidth/2)

【讨论】:

  • 不幸的是,这不是一个完美的选择,但对于我提供的样品来说绝对是一个很好的尝试。我又加了一些;我仍然对此一无所知。
  • 你能展示这些神奇变换的图片吗? (注意与第一个新示例中右边缘的相同差异)
【解决方案2】:

你的数学是错误的。你说,“新点的 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)。

【讨论】:

    【解决方案3】:

    我不得不解决一个类似的问题。我有一张 1920x1080 像素的图片,我想将该图片缩小 1.3,然后我想知道缩小图片中的一个点,哪个位置对应于原始图片中的那个点。我展示了一张我想做的照片。

    Problem

    然后,我得到了一张 1477x831 的缩小图片,因为 (1920/1.3, 1080/1.3)。如果a在原始图片中的位置(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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多