1

Java BufferedImageのサイズを変更して、垂直方向に小さくしますが、平均化のタイプを使用しないようにします。これにより、ソース画像のピクセル行が「空白」(白)の場合、宛先画像の対応する位置:「最小」操作。デフォルトのアルゴリズム(getScaledInstanceで指定)では、十分にきめ細かい制御ができません。次のロジックを実装したいと思います。

for each pixel row in the w-pixels wide destination image, d = pixel[w]
   find the corresponding j pixel rows of the source image, s[][] = pixel[j][w]
   write the new line of pixels, so that d[i] = min(s[j][i]) over all j, i

私はRescaleOpを読んでいますが、この機能を実装する方法を理解していません。これは確かに奇妙なタイプのスケーリングです。誰かが私にこれを行う方法についての指針を提供できますか?最悪の場合、宛先のImageBufferを予約して、擬似コードに続くピクセルをコピーできると思いますが、もっと良い方法があるかどうか疑問に思いました。

4

1 に答える 1

1

RescaleOpメソッドには、RenderingHintsと呼ばれるパラメーターが含まれています。KEY_INTERPOLATION画像を拡大縮小するときに使用する色を決定するというヒントがあります。

KEY_INTERPOLATIONの値を使用する場合VALUE_INTERPOLATION_NEAREST_NEIGHBOR、Javaは、ある種のアルゴリズムを使用して新しい色を再計算するのではなく、元の色を使用します。

したがって、白い線が灰色または色の混合に変わる代わりに、白い線が表示されるか、まったく線が表示されません。それはすべてスケーリング係数に依存し、それが偶数行か奇数行かによって異なります。たとえば、半分に拡大縮小している場合、1ピクセルの水平線ごとに、新しい画像に表示される変化が少なくとも50%変化します。ただし、白い線の高さが2ピクセルの場合、100%の確率で白い線が表示されます。

これは、独自のスケーリングメソッドを作成する以外に、おそらく最も近いものです。残念ながら、これ以上役立つヒントは他にありません。

BufferedImageOp独自のスケーリングメソッドを実装するには、インターフェイスを実装する新しいクラスを作成し、メソッドを実装しますfilter()getRGB()BufferedImageオブジェクトでとを使用setRGB()して、元の画像からピクセルを取得し、新しい画像にピクセルを設定します。

于 2010-03-29T18:12:44.380 に答える