2016-07-30 56 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