如何逐个像素地显示位图?

时间:2012-02-23 15:07:29

标签: android image bitmap pixel

我试图逐个像素地显示位图图像(明确表示有一些延迟)。 我使用两个“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; 我有这个测试,而不是实际的灰度值......

2 个答案:

答案 0 :(得分: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
    } 
} 

答案 1 :(得分:0)

我还制作了一个程序,用于读取图像中每个像素的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

修改

现在我明白了,抱歉。 at:iImageArray[j] = 0xFFFFFFFF; 还要添加iImageArray[i] = 0xFFFFFFFF; 它应该工作