2012-04-13 7 views
0

BufferedImagesを描画する際に問題があります。私は2Dタイルベースのマップエディタで作業しています。タイルを描画するときは、最初に下位レイヤーの後に最上位レイヤーを描画します。この方法はJLabelのを拡張するクラスであること透明でないBufferedImage上に透明なBufferedImageを描画する

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.drawImage(tileLayer, 0, 0, null); 
    g.drawImage(objectLayer, 0, 0, null); 
} 

注:これ等 。それは実際に設定されたImageIconを再描画しています。ここで問題を理解するには、objectLayerのBufferedImageを作成する前に、各ピクセルの色を確認する必要があります。ピクセルがその色である場合、そのピクセルはアルファ値が0のすべての白に設定されます(透明になるように)。例:

int transparentRed = transparentColor.getRed(); 
    int transparentGreen = transparentColor.getGreen(); 
    int transparentBlue = transparentColor.getBlue(); 


for (int x = 0; x < image.getWidth(); x++) 
{ 
    for (int y = 0; y < image.getHeight(); y++) 
    { 
     int color = i.getRGB(x, y); 

     int red = (color & 0x00FF0000) >> 16; 
     int green = (color & 0x0000FF00) >> 8; 
     int blue = color & 0x000000FF; 

     // If the pixel matches the specified transparent color 
     // Then set it to an absolute white with alpha at 0 
     if (red == transparentRed && green == transparentGreen && blue == transparentBlue) 
      i.setRGB(x, y, 0x00FFFFFF); 
    } 
} 

    return i; 

重要な点は、以前に配置された下位レイヤーのピクセルに影響を与えずに下位レイヤーに上レイヤーを描画することです。最上階層の白いピクセルは表示されません。

問題は、これは一部の画像や他の画像では機能しないということです。特定の画像では、最上のレイヤーを描画するときに、とにかく(アルファ値が0に設定されていないかのように)白を描画し、他の画像では魅力的に機能し、白いピクセルは描画されませんin。

.pngイメージのみを使用していますので、フォーマットする必要はありません。私は非常にいくつかのことを試みました。誰かが手伝ってもらえれば、私は立ち往生しています。

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。私たちはまた、1.小さな(バイト)イメージへのリンクが必要です。 2.失敗した小さな画像。 –

+0

'g.drawImage(tileLayer、0、0、null);'(両方ともに) 'this'のために' null'をスワップします。 –

+0

それを試しましたが、それは助けに見えませんでした。 – Kyle

答えて

0

デフォルトでは、BufferedImageはアルファチャンネルをサポートしていないと思います。 BufferedImageを構築するときに、BufferedImage.TYPE_INT_ARGBを渡して問題を修正しました。

+0

これを拡張できますか? – JahKnows

関連する問題