2017-05-31 61 views
0

我一直在研究java和libgdx上的高斯模糊。它主要作品...Java,LibGDX - 高斯模糊分色器故障 - 接收負值

This is the image that I am trying to blur.

This is the result.

的問題是紅色的值等於-1在大多數情況下,而不是像255找遍了很多論壇,他們不解決這個問題。 I 也注意到大多數人使用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時,你的號碼是負值。您可以通過&避免這種「與255

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

荷蘭國際集團本質上-1&0xff = 255

還有一個無符號向右移位運算符>>>這將使你同樣的結果。

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

這兩種方法都能很好地解決我的問題。非常感謝你! – Hunter