2017-07-04 14 views
0

Javaのユーザ定義関数に従ってイメージをワープします。一般に、画像は比較的大きい(JPEG、30〜50MB)。自分の関数に従ったJavaの高速画像ワーピング

はまず、イメージがロードされている:

BufferedImage img = ImageIO.read("image.jpg"); 

と仮定[X、Y] [X、Y]は、そのピクセル座標を表す画像のリサンプリングピクセル座標であること。

座標の関数である(簡単な例)次のように書かれた:

X = y * cos(x); 
Y = x; 

私のアイデアは、ピクセルごとの変換を使用することである。

//Get size of the raster 
int width = img.getWidth(), height = img.getHeight(); 
int proj_width = (int)(width * Math.cos(height*Math.pi/180)),proj_height = height; 

//Create output image 
BufferedImage img2 = new BufferedImage(proj_width+1, proj_height+1, img.getType()); 

//Reproject raster 
for (int i = 0; i < img.getWidth(); i++) { 
     for (int j = 0; j < img.getHeight(); j++) { 

      //Color of the pixel 
      int col = img.getRGB(i, j); 

      //Its new coordinates 
      int X = (int)(i * Math.cos(j*Math.pi/180)); 
      int Y = j; 

      //Set X,Y,col to the new raster 
      img2.setRGB(X,Y,col);     
     } 
    } 

を実現するための任意のより高速な方法はあります追加のライブラリを使用せずにこの操作を行いますか?ワープクラスのwarpRect()メソッドを使用して、例えば

...あなたの助けを

感謝。

+0

「ワープ」クラスとは何ですか?これはすでに別の図書館のようです... – haraldK

答えて

1

get/setRGB()を使用すると、Java2D APIのピクセルをコピーするのが最も簡単ですが、おそらく最も遅い方法です。これは、各ピクセルの値が、元の表現からsRGBカラースペースのパック32ビットARGB形式に変換されなければならないからです。

本当に気にしないネイティブの画素データは(Writable)Rasterを使用して、あなたのケースのように見え、そのget/setDataElements()方法は、(BufferedImage種類によって異なり、どれほど速い)に高速である可能性が高いものを:

私も変化していること
// Reproject raster 
Object pixel = null; 

Raster from = img.getRaster(); 
WritableRaster to = img2.getRaster(); // Assuming img2.getType() == img.getType() always 

for (int y = 0; y < img.getHeight(); y++) { 
    for (int x = 0; x < img.getWidth(); x++) { 
     // Color of the pixel 
     pixel = from.getDataElements(x, y, pixel); 

     // Its new coordinates 
     int X = (int) (x * Math.cos(y * Math.pi/180)); 
     int Y = y; 

     // Set X,Y,pixel to the new raster 
     to.setDataElements(X, Y, pixel);     
    } 

}

注意ネストされたループは内部ループの幅を反復処理します。これは、データのローカリティと通常のCPUのキャッシングにより、パフォーマンスが向上する可能性があります。

関連する問題