2016-07-30 104 views
1

我正在開發一個像學習圖像處理和android應用程序的Instagram。但是我卡住了,我的應用程序中實施灰度過濾器時出現問題。我正在嘗試一種簡單的方法來將位圖中的各個像素轉換爲灰度。如何操作位圖中的像素?

這裏是全班我寫信給不同的過濾器應用於圖像:

package com.dosa2.photoeditor.ImageEffects; 

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.ColorMatrix; 
import android.graphics.ColorMatrixColorFilter; 
import android.graphics.Paint; 

public class ImageEffects { 

    Bitmap bitmap; 
    int width, height; 

    public ImageEffects(Bitmap bitmap) { 
     this.bitmap = bitmap; 
     width = bitmap.getWidth(); 
     height = bitmap.getHeight(); 
    } 

    public Bitmap toGrayscale() { 

     Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(resultBitmap); 
     Paint p = new Paint(); 
     ColorMatrix cm = new ColorMatrix(); 
     cm.setSaturation(0); 
     ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
     p.setColorFilter(f); 
     c.drawBitmap(bitmap, 0, 0, p); 

     return resultBitmap; 
    } 

    public Bitmap toGrayscale2() { 
     Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

     for(int i=0;i<height;i++) { 
      for (int j=0;i<width;j++) { 
       int c = bitmap.getPixel(i,j); 
       resultBitmap.setPixel(i, j, (Color.red(c)+Color.blue(c)+Color.green(c)/3)); 
      } 
     } 

     return resultBitmap; 
    } 
} 

我曾嘗試2種方法的位圖轉換成灰度。前者似乎在工作(但我無法理解),後者則不是。 任何人都可以幫我嗎?如果有更簡單的方式來操縱Android中的圖片,請務必提及。

+0

前者(使用ColorMatrix)是最有效的。因爲它可以一次完成整個位圖,而不必循環到2個循環。您可能一開始並不瞭解ColorMAtrices,但有很多文檔(不僅在Java中,而且在Android中也是如此 - 例如,我也在VB,NET和C#中使用它們) –

+0

我在哪裏可以找到文檔或一個良好的學習資源?對於Google而言,這個Google地址是 – jstraj

+0

。 –

回答

1

錯誤(或其中至少有一個......)在for循環中的一個:

for (int j=0;i<width;j++) 

應該

for (int j=0;j<width;j++) 

,以防止無限循環。

+0

是的,它的工作! 什麼樣的愚蠢我:( 對不起,謝謝 – jstraj

0

您的方法「toGrayscale」使用ColorMatrix類,我認爲它內部使用RenderScript API來執行渲染(或至少GPU着色器)。 RenderScript是Android的計算API(與OpenCL類似,實際上,它是一個可在OpenCL上運行的圖層),所以您不僅僅使用CPU進行顏色過濾,甚至還使用GPU或其他DSP來處理設備可能有。第二種方法「toGrayscale2」較慢,因爲您只使用CPU將您的位圖轉換爲灰度(逐個像素),並且您不應該使用它。檢查this presentation(這很有意思),以便更多地瞭解第一種方法的工作方式,鏈接指向頁面12,這是關於濾色的,但您應該完全查看它以便更好地理解。

+0

謝謝@ josemgu91但爲什麼帆布和畫圖類? – jstraj

+0

@ user5482992正如在Canvas類文檔中所述(https://developer.android.com/reference//繪製東西,你需要4個基本組件:一個位圖來保存像素,一個畫布來承載畫圖調用(寫入位圖),一個繪圖基元(例如Rect,Path ,文本,位圖)和繪畫(描述繪畫的顏色和樣式)。「我認爲wilk可以幫助你更好地理解這些類:)。 – josemgu91

+0

哦,我明白了。現在我可以多瞭解一點。謝謝@ josemgu91 :) – jstraj