Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何操作位图中的像素?_Java_Android_Bitmap - Fatal编程技术网

Java 如何操作位图中的像素?

Java 如何操作位图中的像素?,java,android,bitmap,Java,Android,Bitmap,我正在开发一个类似Instagram的应用程序,用于学习图像处理和android。但我被卡住了,我在应用程序中实现灰度过滤器时遇到了问题。我现在正在尝试一种简单的方法将位图中的单个像素转换为灰度 以下是我正在编写的整个课程,旨在对图像应用各种过滤器: package com.dosa2.photoeditor.ImageEffects; import android.graphics.Bitmap; import android.graphics.Canvas; import android.

我正在开发一个类似Instagram的应用程序,用于学习图像处理和android。但我被卡住了,我在应用程序中实现灰度过滤器时遇到了问题。我现在正在尝试一种简单的方法将位图中的单个像素转换为灰度

以下是我正在编写的整个课程,旨在对图像应用各种过滤器:

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;
    }
}
package com.dosa2.photoeditor.ImageEffects;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.ColorMatrix;
导入android.graphics.ColorMatrixColorFilter;
导入android.graphics.Paint;
公共类图像效果{
位图;
int宽度、高度;
公共图像效果(位图){
this.bitmap=位图;
宽度=位图.getWidth();
高度=位图.getHeight();
}
公共位图toGrayscale(){
位图结果位图=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
画布c=新画布(resultBitmap);
油漆p=新油漆();
ColorMatrix cm=新的ColorMatrix();
cm.设定饱和度(0);
ColorMatrixColorFilter f=新的ColorMatrixColorFilter(厘米);
p、 设置彩色滤光片(f);
c、 drawBitmap(位图,0,0,p);
返回结果位图;
}
公共位图toGrayscale2(){
位图结果位图=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
for(int i=0;i错误(或至少其中一个…)位于for循环之一中:

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

for(int j=0;i您的方法“toGrayscale”使用ColorMatrix类,我认为它在内部使用RenderScript API进行渲染(或者至少是GPU着色器)。RenderScript是Android的计算API(与OpenCL类似,实际上是一个在OpenCL上工作的层),因此,您不仅使用CPU进行颜色过滤,甚至还使用设备上的GPU或其他DSP。第二种方法“toGrayscale2”速度较慢,因为您仅使用CPU将位图转换为灰度(逐像素),而不应该使用它。检查(这很有趣)为了更好地理解第一种方法的工作原理,链接指向第12页,该页是关于颜色过滤的,但为了更好地理解,您应该完整地查看它。

前者(使用颜色矩阵)是最有效的一种。因为它可以一次在整个位图上工作,只需一步,而不必循环成两个循环。一开始你可能不了解颜色矩阵,但有很多文档(不仅在Java中,而且不仅在Android中-例如,我也在VB、NET和C#中使用它们)我在哪里可以找到文档或一个好的学习资源?是的,它起作用了!我是多么愚蠢:(对不起,谢谢你谢谢@josemgu91,但是为什么要使用Canvas和Paint类?@user5482992,如Canvas类文档()中所述):“要绘制一些东西,你需要4个基本组件:一个位图来保存像素,一个画布来承载绘制调用(写入位图)、绘图原语(例如Rect、路径、文本、位图)和绘画(用于描述绘图的颜色和样式)。“。我认为这将帮助您更好地理解这些类:)。哦..我明白了。现在我可以了解更多。谢谢@josemgu91:)
for (int j=0;j<width;j++)