如何逐个像素显示位图?
问题描述:
我想显示一个像素逐像素(明确意味着有一些延迟)。 我使用两个“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
}
}
答
我也做了一个程序,读取图像中的每个像素的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;
那么它应该工作
谢谢:)没有意识到......现在,如果你想打印一些延迟......假设如果添加();在iImageArray之上,整个用户界面被延迟......如何处理这个? – jxgn 2012-02-24 03:11:36
推迟GUI线程是一个坏主意。您可以启动一个新线程,该线程需要花时间更新位图,然后定期通知GUI线程进行绘制(postInvalidate),以便用户可以在动作发生时看到该动作。 – BitBank 2012-02-24 03:15:21
好吧,我现在的想法:)但我只是一个初学者,所以如果你可以给我一个例子,这将是伟大的:)谢谢:) – jxgn 2012-02-24 03:19:17