【问题标题】:How to display bitmap pixel by pixel in Android?如何逐像素显示位图?
【发布时间】:2012-03-14 00:12:07
【问题描述】:

我正在尝试逐像素显示位图图像(这明确意味着有一些延迟)。 我正在使用两个“for”循环来做到这一点,但它只打印一行像素...... 如果有人对如何做有任何想法????请帮助...... 我的代码是这样的............

Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
            //Toast.makeText(getBaseContext(), "Printing...", Toast.LENGTH_SHORT).show();
             iImageArray = new int[bMap.getWidth()* bMap.getHeight()];                                   //initializing the array for the image size
             bMap.getPixels(iImageArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());   //copy pixel data from the Bitmap into the 'intArray' array  

             //Canvas canvas = new Canvas (bMap);
             //replace the red pixels with yellow ones  
             for (int i=0; i < bMap.getHeight(); i++)  
             {  
                 for(int j=0; j<bMap.getWidth(); j++)
                 {

                     iImageArray[j] = 0xFFFFFFFF;
                 } 
             } 
             bMap = Bitmap.createBitmap(iImageArray, bMap.getWidth(), bMap.getHeight(), Bitmap.Config.ARGB_8888);//Initialize the bitmap, with the replaced color
             image.setImageBitmap(bMap);
             //canvas.drawPoints(iImageArray, 0, bMap.getHeight()*bMap.getWidth(), paint);
        }
    });

我想以灰度打印位图,为此我找到了这段代码....

     public Bitmap toGrayscale(Bitmap bmpOriginal)
{        
    int width, height;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    c.drawBitmap(bmpOriginal, 0, 0, paint);
    return bmpGrayscale;
}

iImageArray[i] = 0xFFFFFFFF; 我有这个要测试,不是实际的灰度值.....

【问题讨论】:

    标签: android image bitmap pixel


    【解决方案1】:

    我还编写了一个程序,从图像中读取每个像素的 RGB 颜色。 这是我要阅读的代码:

    int orgWidth = bmp.getWidth();
    int orgHeight = bmp.getHeight();
    //define the array size
    int[] pixels = new int[orgWidth * orgHeight];
    
    bmp.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight);
    
    for (int y = 0; y < orgHeight; y++){
        for (int x = 0; x < orgWidth; x++){
        }
    }
    

    这就是我的数组的工作方式。 上周我提出了一个关于远程像素检查的问题,但是我也自己修复了它:) Optimize Color range check with nested for loop

    编辑:

    现在我明白了,对不起。 在:iImageArray[j] = 0xFFFFFFFF; 也加iImageArray[i] = 0xFFFFFFFF; 那么它应该可以工作

    【讨论】:

    • 答案与我在我的问题中提出的相同......它逐像素打印,就像 for 循环需要做的那样!!!!而是只打印了一行……并没有改变图像的其余部分
    • 您的意思是 for 循环确实有效。但它只打印 1 行像素?
    • 我有一个位图数组,其中包含位图图像的像素。现在我想在屏幕上逐个像素地打印像素,或者一次说一个像素块,用户也可以看到......有没有办法我可以做到这一点????在此先感谢........并且画布,绘画,绘制对象会出现吗????
    • 我不知道,我不是很熟练,两周前刚开始接触android java编程。 BitBank 有更多的代表,也许他知道 :)
    【解决方案2】:

    您的代码看起来基本正确,除了您的内部循环。您的评论说您将它们设置为黄色,但实际上您存储的是白色。该循环只会影响第一行像素,因为您的数组索引的范围为 0 到 width-1。您可以通过乘以 (i*width+j) 来计算索引,也可以保留一个递增的计数器。

    原版:

    //replace the red pixels with yellow ones  
    for (int i=0; i < bMap.getHeight(); i++)  
    {  
        for(int j=0; j<bMap.getWidth(); j++)
        {
            iImageArray[j] = 0xFFFFFFFF;
        } 
    } 
    

    固定版本:

    //replace the red pixels with yellow ones
    int iWidth = bMap.getWidth();  
    for (int i=0; i < bMap.getHeight(); i++)  
    {  
        for(int j=0; j<bMap.getWidth(); j++)
        {
            iImageArray[(i*iWidth)+j] = 0xFF00FFFF; // actual value of yellow
        } 
    } 
    

    【讨论】:

    • 谢谢 :) 没有意识到......现在如果你想延迟打印......假设 if add for();在 iImageArray 上方,整个 UI 都被延迟了……怎么办???
    • 延迟 GUI 线程是个坏主意。您可以启动一个新线程,它会花时间更新位图,然后定期告诉 GUI 线程进行绘制 (postInvalidate),以便用户可以看到发生的动作。
    • 好的,我现在明白了 :) 但我只是这里的初学者,所以如果你能给我一个例子,那就太好了:) 谢谢 :)
    • 您要我为您编写程序,这是不合理的。您可以找到有关如何在 Android 中使用线程的示例。您需要在原始代码中修复的一件事是在从 iImageArray 创建新位图之前显式释放原始位图 (bMap.recycle)。
    • 我想我已经弄清楚了线程部分。现在我在下面的帖子中发表了评论。你能给我一些关于如何继续前进的想法吗???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多