【问题标题】:How to create bulging effect is Java?Java是如何创建凸出效果的?
【发布时间】:2014-10-22 21:37:27
【问题描述】:

我正在尝试创建一个 Java 函数,通过将像素移动到图像的相对中心来对图像产生凸出效果。我首先取像素的(x,y)坐标,找到相对位移,x = x-(x/2) 并将其转换为极坐标形式 [rcos(a), rsin (一个)]。 r 通过以下方式找到:r = Math.sqrt(xx + yy)。使用 Math.atan2(y/x) 找到角度 a。使用 r' = 2r^1.5 找到新半径 (r')。但是,来自 [rcos(a), rsin(a)] 的新 x,y 值超出了图像的尺寸,并出现错误。

我犯了一个根本性的错误吗?

public void bulge()
  {
    double xval, yval = 0;
    //loop through the columns
    for(int x = 0; x < this.getWidth(); x++)
    {
      //loop through the rows
      for(int y = 0; y < this.getHeight(); y++)
      {
        int redValue, greenValue, blueValue = 0;
        double newRadius = 0;

        Pixel pixel = this.getPixel(x,y);
        redValue = pixel.getRed();
        greenValue = pixel.getGreen();
        blueValue = pixel.getBlue();

        xval = x - (x/2);
        yval = y - (y/2);

        double radius =  Math.sqrt(xval*xval + yval*yval);
        double angle = Math.atan2(yval, xval);
        newRadius = 2*(Math.pow(radius,1.5));
        xval = (int)(newRadius*Math.sin(angle));
        yval = (int)(newRadius*Math.cos(angle));

        Pixel pixelNewPos = this.getPixel((int)xval, (int)yval);
        pixelNewPos.setColor(new Color(redValue, greenValue, blueValue));
      }
    }
  }

【问题讨论】:

  • 为什么不确保它们不超过图像的大小?比如,把这些部分剪掉?
  • @Joehot200,我尝试使用: if(xval>this.getWidth()){xval = this.getWidth();} if(yval>this.getHeight()) {yval = this.getHeight();} 但它似乎不起作用。

标签: java image effect


【解决方案1】:

通过从图像 B 中的像素到图像 A 中的像素的反向变换,成功地应用从源图像 A 到目标图像 B 的变换要容易得多。

我的意思是对于目标图像 B 中的每个像素,确定源图像 A 中对颜色有贡献的一个或多个像素。这样一来,您就不会在目标图像中得到一大堆未被触摸的像素。

作为一个使用 2 倍线性缩放操作的示例,一个简单的实现可能如下所示:

for (int x = 0; x < sourceWidth; ++x) {
  for (int y = 0; y < sourceHeight; ++y) {
    Pixel sourcePixel = sourceImage.getPixel(x, y);
    int destPixelX = x * 2;
    int destPixelY = y * 2;
    destImage.setPixel(destPixelX, destPixelY, sourcePixel);
  }
}

从这段代码中可以清楚地看出,具有奇数 X 或 Y 值的像素不会在目标图像中设置。

更好的方法是这样的:

for (int x = 0; x < destWidth; ++x) {
  for (int y = 0; y < destHeight; ++y) {
    int sourcePixelX = x / 2;
    int sourcePixelY = y / 2;
    Pixel sourcePixel = sourceImage.getPixel(sourcePixelX, sourcePixelY);
    destImage.setPixel(x, y, sourcePixel);
  }
}

虽然这通常不是一个好的图像放大算法,但它确实展示了如何确保设置目标图像中的所有像素。

【讨论】:

    【解决方案2】:

    我犯了一个根本性的错误吗?

    在概念层面,是的。您的算法正在拍摄矩形图像并移动像素的位置以提供更大的非矩形图像。显然这不适合你原来的矩形。

    因此,您要么需要剪裁(即丢弃)矩形之外的像素,要么需要使用更大的矩形,以便所有映射的像素都落在其中。

    在后一种情况下,边缘会出现间隙......如果您的转换正在执行您声称的操作。矩形的非线性变换不会有直边。

    【讨论】:

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