绘制位图的最快方式

时间:2015-10-12 11:19:14

标签: java android opengl-es

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或更快的方式来实现它。你能给我任何关于它或任何样品的建议吗?

1 个答案:

答案 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);
    }