private void RenderImage(IImage image) { IntPtr imageToRender = IntPtr.Zero; Size imageToRenderSize = emptySize; if (null != image) { imageToRender = image.Bitmap.GetHbitmap(); imageToRenderSize = image.Size; } lock (_imageToRenderLock) { if (IntPtr.Zero != _imageToRender) { GDI.DeleteObject(_imageToRender); } _imageToRender = imageToRender; _imageToRenderSize = imageToRenderSize; } using (Graphics g = pictureBox.CreateGraphics()) pictureBoxPaint(g, pictureBox.ClientRectangle); }
private void pictureBoxPaint(Graphics g, Rectangle clipRectange) { lock (_imageToRenderLock) { if (IntPtr.Zero != _imageToRender) { Rectangle viewRec = pictureBox.ClientRectangle; Size imageSz = _imageToRenderSize; int x = 0; int y = 0; int w = viewRec.Width; int h = (imageSz.Height * viewRec.Width) / imageSz.Width; if (h > viewRec.Height) { w = (imageSz.Width * viewRec.Height) / imageSz.Height; h = viewRec.Height; x = (viewRec.Width - w) / 2; } else { y = (viewRec.Height - h) / 2; } if (x > 0) { Rectangle rec = new Rectangle(viewRec.Left, viewRec.Top, viewRec.Left + x, viewRec.Bottom); rec.Intersect(clipRectange); if (!rec.IsEmpty) { g.FillRectangle(SystemBrushes.ControlDark, rec); } rec = new Rectangle(viewRec.Left + x + w, viewRec.Top, viewRec.Right, viewRec.Bottom); rec.Intersect(clipRectange); if (!rec.IsEmpty) { g.FillRectangle(SystemBrushes.ControlDark, rec); } } if (y > 0) { Rectangle rec = new Rectangle(viewRec.Left, viewRec.Top, viewRec.Right, viewRec.Top + y); rec.Intersect(clipRectange); if (!rec.IsEmpty) { g.FillRectangle(SystemBrushes.ControlDark, rec); } rec = new Rectangle(viewRec.Left, viewRec.Top + y + h, viewRec.Right, viewRec.Bottom); rec.Intersect(clipRectange); if (!rec.IsEmpty) { g.FillRectangle(SystemBrushes.ControlDark, rec); } } IntPtr destHdc = g.GetHdc(); IntPtr srcHdc = GDI.CreateCompatibleDC(destHdc); IntPtr prevBmp = GDI.SelectObject(srcHdc, _imageToRender); GDI.StretchBlt(destHdc, viewRec.Left + x, viewRec.Top + y, w, h, srcHdc, 0, 0, imageSz.Width, imageSz.Height, GDI.TernaryRasterOperations.SRCCOPY); GDI.SelectObject(srcHdc, prevBmp); GDI.DeleteDC(srcHdc); g.ReleaseHdc(destHdc); } } }