private static void WriteRgb(Bitmap value, int xOffset, int yOffset, Band first, Dataset set) { if (set.RasterCount < 3) { throw new GdalException( "RGB Format was indicated but there are only " + set.RasterCount + " bands!"); } int width = value.Width; int height = value.Height; BitmapData bData = value.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int stride = Math.Abs(bData.Stride); byte[] vals = new byte[stride * height]; Marshal.Copy(bData.Scan0, vals, 0, vals.Length); value.UnlockBits(bData); byte[] r = new byte[width * height]; byte[] g = new byte[width * height]; byte[] b = new byte[width * height]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { b[row * width + col] = vals[row * stride + col * 4]; g[row * width + col] = vals[row * stride + col * 4 + 1]; r[row * width + col] = vals[row * stride + col * 4 + 2]; } } Band green = set.GetRasterBand(2); Band blue = set.GetRasterBand(3); first.WriteRaster(xOffset, yOffset, width, height, r, width, height, 0, 0); first.FlushCache(); green.WriteRaster(xOffset, yOffset, width, height, g, width, height, 0, 0); green.FlushCache(); blue.WriteRaster(xOffset, yOffset, width, height, b, width, height, 0, 0); blue.FlushCache(); // first disposed in caller green.Dispose(); blue.Dispose(); }