2017-05-31 2 views
0

私はjavaとlibgdxでガウスのボケを処理しています。これは、主に等しい-1ほとんどのケースではなく、255のようなものを私は、フォーラムの多くを検索しましたし、彼らが対処しない問題が赤の値である...Java、LibGDX - ガウスブラーカラーセパレータのトラブル - 負の値を受け取る

This is the image that I am trying to blur.

This is the result.

の作品この問題。私も は、ほとんどの人がARGB8888を使用していますが、badlogicsライブラリにはRGBA8888形式のARGB8888フォーマットがないことに気付きました。 私はまた、RGBA8888がビットで情報をどのように格納しているのか、問題を解決するのに十分ではないものについてウェブサイトを検索しました。

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Pixmap; 
import com.badlogic.gdx.graphics.PixmapIO; 
import com.badlogic.gdx.utils.BufferUtils; 
import com.badlogic.gdx.utils.ScreenUtils; 

import java.awt.image.ConvolveOp; 
import java.nio.ByteBuffer; 


public class ScreenCapture { 
    public void capture(){ 
     float output = 0; 

     int[] all = new int[11]; 

     Pixmap originalPixmap = new Pixmap(Gdx.files.internal("graphics/menu/test.png")); 

     Pixmap pixmapVertical = new Pixmap(originalPixmap.getWidth(), originalPixmap.getHeight(), Pixmap.Format.RGBA8888); 
     Pixmap pixmap = new Pixmap(pixmapVertical.getWidth(), pixmapVertical.getHeight(), Pixmap.Format.RGBA8888); 

     for (int y = 0;y < originalPixmap.getHeight();y++){ 
      for (int x = 0;x < originalPixmap.getWidth();x++){ 
       for (int i = -5; i < 5; i++) { 
        all[i+5] = originalPixmap.getPixel(x+i, y); 
       } 
       pixmapVertical.setColor(blur(all)); 
       pixmapVertical.drawPixel(x, y); 
      } 
     } 
     for (int x = 0;x < pixmapVertical.getWidth();x++){ 
      for (int y = 0;y < pixmapVertical.getHeight();y++){ 

       for (int i = -5; i < 5; i++) { 
        all[i+5] = pixmapVertical.getPixel(x, y+i); 
       } 
       pixmap.setColor(blur(all)); 
       pixmap.drawPixel(x, y); 
      } 
     } 


     PixmapIO.writePNG(Gdx.files.local("screen.png"), pixmap); 
     originalPixmap.dispose(); 
     pixmapVertical.dispose(); 
     pixmap.dispose(); 

     int rgb = 0xffffffff; 
     int test = ((rgb & 0xff000000) >> 24); 
     System.out.println(test); 

    } 
    private int blur(int[] all){ 
     float[] weight = {0.0093f, 0.028002f, 0.065984f, 0.121703f, 0.175713f, 0.198596f, 0.175713f, 0.121703f, 0.065984f, 0.028002f, 0.0093f}; 
     float r = 0; 
     float g = 0; 
     float b = 0; 
     float a = 0; 
     for (int i = 0; i < 11; i++){ 
      b += (((all[i] & 0x0000ff00)>>8)*weight[i]); 
      r += (((all[i] & 0xff000000)>>24)*weight[i]); 
      g += (((all[i] & 0x00ff0000)>>16)*weight[i]); 
      a += (((all[i] & 0x000000ff))*weight[i]); 
     } 
     return (((int) r << 24 | (int)g << 16 | (int)b << 8 | (int)a)); 
    } 
} 
+0

シフト後に '&'を実行してみてください。問題はintが署名されているようです。 http://ideone.com/vV1OO3 – matt

答えて

1

数値が負の値になります。例えば。赤色が255の場合、数字はマイナスです。あなたはあなたに同じ結果を与える符号なし右シフト演算>>>もあり

-1&0xff = 255

基本的に255

int r += (((all[i]>>24) & 0xff))*weight[i]); 

とINGの」&ことで、これを回避することができます。

int r += ((all[i]>>>24))*weight[i]); 
+0

両方の方法が私の問題を解決するために完全に機能しました。どうもありがとうございました! – Hunter

関連する問題