Dauezevy
Dauezevy

Reputation: 1080

Fastest way the draw bitmap

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;
}

I have a function to create a bitmap from pixel data. But image is big, so this method is too slow for my program. I want to make it with OpenGL ES or faster way. Could you give me any suggestion about it or any sample?

Upvotes: 0

Views: 614

Answers (1)

Androider
Androider

Reputation: 3873

Try to lock the bitmap data,use pointers to manually set the values. This is fastest.

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

Upvotes: 1

Related Questions