如何在Android中逐像素显示位图?

jxg*_*xgn 6 android image pixel bitmap

我正在尝试逐像素显示位图图像(这明确意味着有一些延迟)。
为此,我使用两个“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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bit*_*ank 3

除了内部循环之外,您的代码看起来基本上是正确的。您的评论说您将它们设置为黄色,但实际上您正在存储白色。该循环只会影响第一行像素,因为数组索引的范围为 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;
    } 
} 
Run Code Online (Sandbox Code Playgroud)

固定版本:

//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
    } 
} 
Run Code Online (Sandbox Code Playgroud)