1

処理中の画像補間方法に問題があります。これは私が思いついたコードであり、外側のループが元の画像よりも進んでいるため、範囲外の例外がスローされることを認識していますが、どうすれば修正できますか?

PImage nearestneighbor (PImage o, float sf)
{
  PImage out = createImage((int)(sf*o.width),(int)(sf*o.height),RGB);
  o.loadPixels();
  out.loadPixels();
  for (int i = 0; i < sf*o.height; i++)
  {
    for (int j = 0; j < sf*o.width; j++)
    {
      int y = round((o.width*i)/sf);
      int x = round(j / sf);
      out.pixels[(int)((sf*o.width*i)+j)] = o.pixels[(y+x)];
    } 
  }

  out.updatePixels();
  return out;
}

私のアイデアは、スケーリングされた画像のポイントを表す両方のコンポーネントをスケールファクターで除算し、それを丸めて最近傍を取得することでした。

4

1 に答える 1

2

IndexOutOfBoundsExceptionの結果をキャッシュしてみてください。(int)(sf*o.width)(int)(sf*o.height)

さらに、とを使用するなどして、それを確認し、境界を離れないようにすることもxできyます。Math.min(...)Math.max(...)

最後にint y = round((i / sf) * o.width;、元のスケールでピクセルを取得してから、元の幅で複数のピクセルを取得する必要があるためです。例:100x100の画像と1.2のスケーリング係数を想定します。スケーリングされた高さは120であるため、の最大値はi119になります。これで、round((119 * 100) / 1.2)が得られround(9916.66) = 9917ます。一方、round(119 / 1.2) * 100結果はround(99.16) * 100 = 9900-ここでは17ピクセルの違いがあります。

ところで、変数名yはy座標ではなく、座標(0、y)のピクセルのインデックス、つまり高さyの最初のピクセルであるため、ここでは誤解を招く可能性があります。

したがって、コードは次のようになります。

int scaledWidth = (int)(sf*o.width);
int scaledHeight = (int)(sf*o.height);
PImage out = createImage(scaledWidth, scaledHeight, RGB);
o.loadPixels();
out.loadPixels();
for (int i = 0; i < scaledHeight; i++) {
  for (int j = 0; j < scaledWidth; j++) {
    int y = Math.min( round(i / sf), o.height ) * o.width;
    int x = Math.min( round(j / sf), o.width );
    out.pixels[(int)((scaledWidth * i) + j)] = o.pixels[(y + x)];
  }
}
于 2012-04-12T07:31:28.210 に答える