private Bitmap ReadArgb(int xOffset, int yOffset, int xSize, int ySize, Band first, Dataset set) { if (set.RasterCount < 4) { throw new GdalException( "ARGB Format was indicated but there are only " + set.RasterCount + " bands!"); } Band first_o; Band red_o; Band green_o; Band blue_o; Band red = set.GetRasterBand(2); Band green = set.GetRasterBand(3); Band blue = set.GetRasterBand(4); int width = xSize; int height = ySize; if (first.GetOverviewCount() > 0 && _overview >= 0) { first_o = first.GetOverview(_overview); red_o = red.GetOverview(_overview); green_o = green.GetOverview(_overview); blue_o = blue.GetOverview(_overview); } else { first_o = first; red_o = red; green_o = green; blue_o = blue; } if (xOffset + width > first_o.XSize) { width = first_o.XSize - xOffset; } if (yOffset + height > first_o.YSize) { height = first_o.YSize - yOffset; } Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb); byte[] a = new byte[width * height]; byte[] r = new byte[width * height]; byte[] g = new byte[width * height]; byte[] b = new byte[width * height]; first_o.ReadRaster(0, 0, width, height, a, width, height, 0, 0); red_o.ReadRaster(0, 0, width, height, r, width, height, 0, 0); green_o.ReadRaster(0, 0, width, height, g, width, height, 0, 0); blue_o.ReadRaster(0, 0, width, height, b, width, height, 0, 0); // Alpha disposed in caller red.Dispose(); green.Dispose(); blue.Dispose(); BitmapData bData = result.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int stride = Math.Abs(bData.Stride); byte[] vals = new byte[height * stride]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { vals[row * stride + col * 4] = b[row * width + col]; vals[row * stride + col * 4 + 1] = g[row * width + col]; vals[row * stride + col * 4 + 2] = r[row * width + col]; vals[row * stride + col * 4 + 3] = a[row * width + col]; } } Marshal.Copy(vals, 0, bData.Scan0, vals.Length); result.UnlockBits(bData); return result; }
private Bitmap ReadRgb(int xOffset, int yOffset, int xSize, int ySize, Band first, Dataset set) { if (set.RasterCount < 3) { throw new GdalException( "RGB Format was indicated but there are only " + set.RasterCount + " bands!"); } Band first_o; Band green_o; Band blue_o; Band green = set.GetRasterBand(2); Band blue = set.GetRasterBand(3); int width = xSize; int height = ySize; if (first.GetOverviewCount() > 0 && _overview >= 0) { first_o = first.GetOverview(_overview); green_o = green.GetOverview(_overview); blue_o = blue.GetOverview(_overview); } else { first_o = first; green_o = green; blue_o = blue; } if (xOffset + width > first_o.XSize) { width = first_o.XSize - xOffset; } if (yOffset + height > first_o.YSize) { height = first_o.YSize - yOffset; } Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb); //byte[] r; if (r == null || r.Length != width * height) { r = new byte[width * height]; } if (g == null || g.Length != width * height) { g = new byte[width * height]; } if (b == null || b.Length != width * height) { b = new byte[width * height]; } if (vals == null || vals.Length != width * height * 4) { vals = new byte[width * height * 4]; } first_o.ReadRaster(xOffset, yOffset, width, height, r, width, height, 0, 0); green_o.ReadRaster(xOffset, yOffset, width, height, g, width, height, 0, 0); blue_o.ReadRaster(xOffset, yOffset, width, height, b, width, height, 0, 0); /* alternative way to call gdal unsafe { fixed (byte* p = r) { IntPtr ptr = (IntPtr)p; first_o.ReadRaster(xOffset, yOffset, width, height, ptr, width, height, DataType.GDT_Byte, 0, 0); } fixed (byte* p = g) { IntPtr ptr = (IntPtr)p; green_o.ReadRaster(xOffset, yOffset, width, height, ptr, width, height, DataType.GDT_Byte, 0, 0); } fixed (byte* p = b) { IntPtr ptr = (IntPtr)p; blue_o.ReadRaster(xOffset, yOffset, width, height, ptr, width, height, DataType.GDT_Byte, 0, 0); } }*/ //first disposed in caller green.Dispose(); blue.Dispose(); BitmapData bData = result.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int stride = Math.Abs(bData.Stride); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { vals[row * stride + col * 4] = b[row * width + col]; vals[row * stride + col * 4 + 1] = g[row * width + col]; vals[row * stride + col * 4 + 2] = r[row * width + col]; vals[row * stride + col * 4 + 3] = 255; } } Marshal.Copy(vals, 0, bData.Scan0, vals.Length); result.UnlockBits(bData); //vals = null; //r = null; //g = null; //b = null; return result; }
private Bitmap ReadGrayIndex(int xOffset, int yOffset, int xSize, int ySize, Band first) { Band first_o; int width = xSize; int height = ySize; if (first.GetOverviewCount() > 0 && _overview >= 0) { first_o = first.GetOverview(_overview); } else { first_o = first; } if (xOffset + width > first_o.XSize) { width = first_o.XSize - xOffset; } if (yOffset + height > first_o.YSize) { height = first_o.YSize - yOffset; } Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb); byte[] r = new byte[width * height]; first.ReadRaster(xOffset, yOffset, width, height, r, width, height, 0, 0); BitmapData bData = result.LockBits(new Rectangle(0, 0, xSize, ySize), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int stride = Math.Abs(bData.Stride); byte[] vals = new byte[height * stride]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { byte value = r[row * width + col]; vals[row * stride + col * 4] = value; vals[row * stride + col * 4 + 1] = value; vals[row * stride + col * 4 + 2] = value; vals[row * stride + col * 4 + 3] = 255; } } Marshal.Copy(vals, 0, bData.Scan0, vals.Length); result.UnlockBits(bData); return result; }
private Bitmap ReadPaletteBuffered(int xOffset, int yOffset, int xSize, int ySize, Band first) { ColorTable ct = first.GetRasterColorTable(); if (ct == null) { throw new GdalException("Image was stored with a palette interpretation but has no color table."); } if (ct.GetPaletteInterpretation() != PaletteInterp.GPI_RGB) { throw new GdalException("Only RGB palette interpretation is currently supported by this " + " plug-in, " + ct.GetPaletteInterpretation() + " is not supported."); } Band first_o; int width = xSize; int height = ySize; byte[] r = new byte[width * height]; if (first.GetOverviewCount() > 0 && _overview >= 0) { first_o = first.GetOverview(_overview); } else { first_o = first; } if (xOffset + width > first_o.XSize) { width = first_o.XSize - xOffset; } if (yOffset + height > first_o.YSize) { height = first_o.YSize - yOffset; } first_o.ReadRaster(xOffset, yOffset, width, height, r, width, height, 0, 0); Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb); BitmapData bData = result.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); int stride = Math.Abs(bData.Stride); const int bpp = 4; byte[] vals = new byte[stride * height]; byte[][] colorTable = new byte[ct.GetCount()][]; for (int i = 0; i < ct.GetCount(); i++) { ColorEntry ce = ct.GetColorEntry(i); colorTable[i] = new[] { (byte) ce.c3, (byte) ce.c2, (byte) ce.c1, (byte) ce.c4 }; } for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { Array.Copy(colorTable[r[col + row * stride]], 0, vals, row * stride + col * bpp, 4); } } Marshal.Copy(vals, 0, bData.Scan0, vals.Length); result.UnlockBits(bData); return result; }
private byte[] ReadArgb(int startRow, int startColumn, int numRows, int numColumns, int overview) { if (_dataset.RasterCount < 4) { throw new GdalException("ARGB Format was indicated but there are only " + _dataset.RasterCount + " bands!"); } _alpha = _red; _red = _dataset.GetRasterBand(2); _green = _dataset.GetRasterBand(3); _blue = _dataset.GetRasterBand(4); if (overview > 0) { _red = _red.GetOverview(overview - 1); _alpha = _alpha.GetOverview(overview - 1); _green = _green.GetOverview(overview - 1); _blue = _blue.GetOverview(overview - 1); } int width = numColumns; int height = numRows; byte[] a = new byte[width * height]; byte[] r = new byte[width * height]; byte[] g = new byte[width * height]; byte[] b = new byte[width * height]; _alpha.ReadRaster(startColumn, startRow, width, height, a, width, height, 0, 0); _red.ReadRaster(startColumn, startRow, width, height, r, width, height, 0, 0); _green.ReadRaster(startColumn, startRow, width, height, g, width, height, 0, 0); _blue.ReadRaster(startColumn, startRow, width, height, b, width, height, 0, 0); byte[] vals = new byte[width * height * 4]; const int bpp = 4; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { vals[row * width * bpp + col * bpp] = b[row * width + col]; vals[row * width * bpp + col * bpp + 1] = g[row * width + col]; vals[row * width * bpp + col * bpp + 2] = r[row * width + col]; vals[row * width * bpp + col * bpp + 3] = a[row * width + col]; } } return vals; }
/// <summary> /// Gets the dimensions of the original (0) plus any overlays. /// The overlays get smaller as the index gets larger.. /// </summary> /// <returns></returns> public Size[] GetSizes() { EnsureDatasetOpen(); _red = _dataset.GetRasterBand(1); int numOverviews = _red.GetOverviewCount(); Debug.WriteLine("Num overviews:" + numOverviews); if (numOverviews == 0) return null; Size[] result = new Size[numOverviews + 1]; result[0] = new Size(_red.XSize, _red.YSize); for (int i = 0; i < numOverviews; i++) { Band temp = _red.GetOverview(i); result[i + 1] = new Size(temp.XSize, temp.YSize); } return result; }