如何逐个像素显示位图?

问题描述:

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

你的代码看起来除了你的内部循环基本上是正确的。您的评论表示您将它们设置为黄色,但实际上存储的是白色。该循环只会影响第一行像素,因为您的数组索引的范围为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 
    } 
} 
+0

谢谢:)没有意识到......现在,如果你想打印一些延迟......假设如果添加();在iImageArray之上,整个用户界面被延迟......如何处理这个? – jxgn 2012-02-24 03:11:36

+0

推迟GUI线程是一个坏主意。您可以启动一个新线程,该线程需要花时间更新位图,然后定期通知GUI线程进行绘制(postInvalidate),以便用户可以在动作发生时看到该动作。 – BitBank 2012-02-24 03:15:21

+0

好吧,我现在的想法:)但我只是一个初学者,所以如果你可以给我一个例子,这将是伟大的:)谢谢:) – jxgn 2012-02-24 03:19:17

我也做了一个程序,读取图像中的每个像素的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; 那么它应该工作

+0

的答案是一样的东西我也问过我的问题.......其打印像素的像素循环需要做什么!!!!相反,它只是打印一行......并没有改变图像的其余部分 – jxgn 2012-02-23 15:23:40

+0

您的意思是for循环确实有效。但它只打印1行像素? – Bigflow 2012-02-23 15:32:49

+0

它没有工作添加“我”....但什么bitbank告诉我工作..... – jxgn 2012-02-24 03:25:49