private ICursor QueryImage(int x, int y) { using (var gdalDataset = OpenGdalDataset()) { unsafe { int bandCount = gdalDataset.RasterCount; string[] tags = new string[bandCount + 2]; object[] values = new object[bandCount + 2]; List <ArgbColor> colors = new List <ArgbColor>(); for (int i = 1; i <= bandCount; ++i) { OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(i); string bandName = ""; switch ((ColorInterp)band.GetRasterColorInterpretation()) { case ColorInterp.BlueBand: bandName = "(blue)"; break; case ColorInterp.GreenBand: bandName = "(green)"; break; case ColorInterp.RedBand: bandName = "(red)"; break; case ColorInterp.GrayIndex: for (int iColor = 0; iColor < 256; iColor++) { colors.Add(ArgbColor.FromArgb(255, iColor, iColor, iColor)); } break; case ColorInterp.PaletteIndex: tags = new string[tags.Length + 4]; values = new object[values.Length + 4]; OSGeo_v3.GDAL.ColorTable colTable = band.GetRasterColorTable(); if (colTable == null) { break; } int colCount = colTable.GetCount(); for (int iColor = 0; iColor < colCount; iColor++) { OSGeo_v3.GDAL.ColorEntry colEntry = colTable.GetColorEntry(iColor); colors.Add(ArgbColor.FromArgb( colEntry.c4, colEntry.c1, colEntry.c2, colEntry.c3)); } break; } int c = 0; int *buf = &c; band.ReadRaster(x, y, 1, 1, (IntPtr)buf, 1, 1, OSGeo_v3.GDAL.DataType.GDT_Int32, 4, 0); band.Dispose(); tags[i + 1] = "Band " + i.ToString() + " " + bandName; values[i + 1] = c; if (colors.Count > 0 && c >= 0 && c < colors.Count) { ArgbColor col = colors[c]; tags[i + 2] = "Alpha"; values[i + 2] = col.A; tags[i + 3] = "Red"; values[i + 3] = col.R; tags[i + 4] = "Green"; values[i + 4] = col.G; tags[i + 5] = "Blue"; values[i + 5] = col.B; } } tags[0] = "ImageX"; values[0] = x; tags[1] = "ImageY"; values[1] = y; return(new QueryCursor(tags, values)); } } }
private IRasterPaintContext PaintImage(int x, int y, int wWidth, int wHeight, int iWidth, int iHeight, ICancelTracker cancelTracker) { if (CancelTracker.Canceled(cancelTracker)) { return(null); } int pixelSpace = 3; var bitmap = Current.Engine.CreateBitmap(iWidth, iHeight, GraphicsEngine.PixelFormat.Rgb24); var bitmapData = bitmap.LockBitmapPixelData(BitmapLockMode.WriteOnly, GraphicsEngine.PixelFormat.Rgb24); try { int stride = bitmapData.Stride; IntPtr buf = bitmapData.Scan0; using (var gdalDataset = OpenGdalDataset()) { List <ArgbColor> colors = new List <ArgbColor>(); for (int i = 1; i <= (gdalDataset.RasterCount > 3 ? 3 : gdalDataset.RasterCount); ++i) { using (OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(i)) { int ch = 0; switch ((ColorInterp)band.GetRasterColorInterpretation()) { case ColorInterp.BlueBand: ch = 0; break; case ColorInterp.GreenBand: ch = 1; break; case ColorInterp.RedBand: ch = 2; break; case ColorInterp.GrayIndex: for (int iColor = 0; iColor < 256; iColor++) { colors.Add(ArgbColor.FromArgb(255, iColor, iColor, iColor)); } break; case ColorInterp.PaletteIndex: OSGeo_v3.GDAL.ColorTable colTable = band.GetRasterColorTable(); if (colTable == null) { break; } int colCount = colTable.GetCount(); for (int iColor = 0; iColor < colCount; iColor++) { OSGeo_v3.GDAL.ColorEntry colEntry = colTable.GetColorEntry(iColor); colors.Add(ArgbColor.FromArgb( colEntry.c4, colEntry.c1, colEntry.c2, colEntry.c3)); } break; } band.ReadRaster(x, y, wWidth, wHeight, new IntPtr(buf.ToInt64() + ch), iWidth, iHeight, OSGeo_v3.GDAL.DataType.GDT_Byte, pixelSpace, stride); band.Dispose(); } } if (colors.Count > 0) { unsafe { byte *ptr = (byte *)(bitmapData.Scan0); for (int i = 0; i < bitmapData.Height; i++) { if (CancelTracker.Canceled(cancelTracker)) { return(null); } for (int j = 0; j < bitmapData.Width; j++) { // write the logic implementation here byte c = ptr[0]; ArgbColor col = colors[c]; ptr[0] = col.B; ptr[1] = col.G; ptr[2] = col.R; ptr += pixelSpace; } ptr += bitmapData.Stride - bitmapData.Width * pixelSpace; } } } return(new RasterPaintContext(bitmap)); } } catch (Exception ex) { if (bitmap != null && bitmapData != null) { bitmap.UnlockBitmapPixelData(bitmapData); bitmapData = null; bitmap.Dispose(); bitmap = null; } throw ex; } finally { if (bitmap != null && bitmapData != null) { bitmap.UnlockBitmapPixelData(bitmapData); } } }