protected Bitmap createBufferedImageFromImageTransport() {
int k = 0, i = 0, j = 0;
int[] pixelData;
Canvas canvas;
Paint paint;
Bitmap newImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas = new Canvas(newImage);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
pixelData = imageTransport.getInt32PixelData();
canvas.drawBitmap(pixelData, 0, width, 0, 0, width, height, false, null);
MainActivity.handler.sendEmptyMessage(1);
return newImage;
}
我有一个从像素数据创建位图的功能。但是图像很大,所以这个方法对我的程序来说太慢了。我想用OpenGL ES或更快的方式来实现它。你能给我任何关于它或任何样品的建议吗?
答案 0 :(得分:1)
尝试锁定位图数据,使用指针手动设置值。这是最快的。
public override void PaintPoint(Layer layer, Point position)
{
// Rasterise the pencil tool
// Assume it is square
// Check the pixel to be set is witin the bounds of the layer
// Set the tool size rect to the locate on of the point to be painted
m_toolArea.Location = position;
// Get the area to be painted
Rectangle areaToPaint = new Rectangle();
areaToPaint = Rectangle.Intersect(layer.GetRectangle(), m_toolArea);
Bitmap bmp;
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = data.Stride;
unsafe
{
byte* ptr = (byte*)data.Scan0;
// Check this is not a null area
if (!areaToPaint.IsEmpty)
{
// Go through the draw area and set the pixels as they should be
for (int y = areaToPaint.Top; y < areaToPaint.Bottom; y++)
{
for (int x = areaToPaint.Left; x < areaToPaint.Right; x++)
{
// layer.GetBitmap().SetPixel(x, y, m_colour);
ptr[(x * 3) + y * stride] = m_colour.B;
ptr[(x * 3) + y * stride + 1] = m_colour.G;
ptr[(x * 3) + y * stride + 2] = m_colour.R;
}
}
}
}
bmp.UnlockBits(data);
}