/// <summary> /// Utility conversion method allowing to convert object implementing <see cref="DjvuNet.Graphics.IMap"/> /// interface to <see cref="System.Drawing.Bitmap"/> object. /// </summary> /// <param name="map"></param> /// <param name="rect"></param> /// <param name="format"></param> /// <returns>Returns <see cref="System.Drawing.Bitmap"/> object which should be disposed after use by caller. </returns> public static System.Drawing.Bitmap ImageFromMap(GMap map, Rectangle rect, PixelFormat format) { Bitmap retVal = new Bitmap(rect.Width, rect.Height, format); BitmapData bmpData = retVal.LockBits(rect, ImageLockMode.WriteOnly, format); int pixelSize = GetPixelSize(format); int bytesPerRow = pixelSize * rect.Width; GCHandle hMapData = GCHandle.Alloc(map.Data, GCHandleType.Pinned); IntPtr pMapData = hMapData.AddrOfPinnedObject(); for (int i = 0; i < rect.Height; i++) { IntPtr destPtr = bmpData.Scan0 + (bmpData.Stride * i); IntPtr srcPtr = (IntPtr)((long)pMapData + (i * bytesPerRow)); MemoryUtilities.MoveMemory(destPtr, srcPtr, bytesPerRow); } if (hMapData.IsAllocated) { hMapData.Free(); } retVal.UnlockBits(bmpData); return(retVal); }
public static Bitmap ImageFromMap(GMap map, Rectangle rect, PixelFormat format) { Bitmap retVal = new Bitmap(rect.Width, rect.Height, format); BitmapData bmpData = retVal.LockBits(rect, ImageLockMode.WriteOnly, format); GCHandle hMapData = GCHandle.Alloc(map.Data, GCHandleType.Pinned); IntPtr pMapData = hMapData.AddrOfPinnedObject(); MemoryUtilities.MoveMemory(bmpData.Scan0, pMapData, map.Data.Length); hMapData.Free(); retVal.UnlockBits(bmpData); return(retVal); }
public System.Drawing.Bitmap BuildPageImage(bool rebuild = false) { const int subsample = 1; int width = _Page.Width / subsample; int height = _Page.Height / subsample; GMap map = null; Rectangle rect = new Rectangle(0, 0, width, height); Bitmap retVal = null; if (rebuild || _Image == null) { map = _Page.GetMap(new GRect(0, 0, width, height), subsample, null); if (map == null) { return(new Bitmap(width, height)); } if (map.BytesPerPixel == 3) { const PixelFormat format = PixelFormat.Format24bppRgb; retVal = DjvuImage.ImageFromMap(map, rect, format); } else if (map.BytesPerPixel == 1) { const PixelFormat format = PixelFormat.Format8bppIndexed; retVal = DjvuImage.ImageFromMap(map, rect, format); } } else { retVal = _Image; } if (map.BytesPerPixel == 3 && IsInverted) { retVal = DjvuImage.InvertColor(retVal); } else if (map.BytesPerPixel == 1) { System.Drawing.Imaging.ColorPalette palette = retVal.Palette; if (!IsInverted) { for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } retVal.Palette = palette; } else { int j = 0; for (int i = 0; i < 256; i++) { j = 255 - i; palette.Entries[i] = Color.FromArgb(j, j, j); } retVal.Palette = palette; } } return(retVal); //int[] pixels = new int[width * height]; //map.FillRgbPixels(0, 0, width, height, pixels, 0, width); //var image = ConvertDataToImage(pixels); //if (IsInverted == true) // image = InvertImage(image); //return image; }