图形对象到图像文件

我想裁剪并调整我的图像大小。 这是我的代码:

Image image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg"); // Crop and resize the image. Rectangle destination = new Rectangle(0, 0, 200, 120); Graphics graphic = Graphics.FromImage(image); graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel); 

现在我假设我生成的裁剪/resize的图像存储在图形对象中。 问题是 – 如何将其保存到文件中?

Graphics.FromImage获取的Graphics对象是Graphics.FromImage的绘图表面。 因此,您可以在完成后保存图像对象。

 string fileName = AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg"); using (Image image = Image.FromFile(fileName) { using (Graphics graphic = Graphics.FromImage(image)) { // Crop and resize the image. Rectangle destination = new Rectangle(0, 0, 200, 120); graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel); } image.Save(fileName); } 

请注意,在jpg图像上重复这样做可能不是一件好事; 每次重新编码图像,由于jpg使用破坏性压缩方法,每次都会丢失一些图像质量。 如果这是一次一次的图像操作,我不会担心。

不, Graphics对象不包含任何图像数据,它用于在canvas上绘制,通常是屏幕或Bitmap对象。

因此,您需要创建一个具有正确尺寸的Bitmap对象,并为该位图创建Graphics对象。 然后你可以保存它。 请记住,应该处理实现IDisposable对象,例如使用using子句:

 using (Image image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg")) { // Create bitmap using (Bitmap newImage = new Bitmap(200, 120)) { // Crop and resize the image. Rectangle destination = new Rectangle(0, 0, 200, 120); using (Graphics graphic = Graphics.FromImage(newImage)) { graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel); } newImage.Save(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle_icon.jpg", ImageFormat.Jpeg); } } 

这不是OP问题的直接答案,但它是一个经常被忽视的工具,可以让你以不同的方式处理事情,如果certificate有必要的话。

人们常说,不可能获得Graphics对象的内容。 这根本不是真的。 使用正确的方法,您可以使用HDC和BitBlt访问canvas上的数据。 以下是使用C#执行此操作的一种方法:

  enum TernaryRasterOperations : uint { /// dest = source SRCCOPY = 0x00CC0020, /// dest = source OR dest SRCPAINT = 0x00EE0086, /// dest = source AND dest SRCAND = 0x008800C6, /// dest = source XOR dest SRCINVERT = 0x00660046, /// dest = source AND (NOT dest) SRCERASE = 0x00440328, /// dest = (NOT source) NOTSRCCOPY = 0x00330008, /// dest = (NOT src) AND (NOT dest) NOTSRCERASE = 0x001100A6, /// dest = (source AND pattern) MERGECOPY = 0x00C000CA, /// dest = (NOT source) OR dest MERGEPAINT = 0x00BB0226, /// dest = pattern PATCOPY = 0x00F00021, /// dest = DPSnoo PATPAINT = 0x00FB0A09, /// dest = pattern XOR dest PATINVERT = 0x005A0049, /// dest = (NOT dest) DSTINVERT = 0x00550009, /// dest = BLACK BLACKNESS = 0x00000042, /// dest = WHITE WHITENESS = 0x00FF0062, ///  /// Capture window as seen on screen. This includes layered windows /// such as WPF windows with AllowsTransparency="true" ///  CAPTUREBLT = 0x40000000 } [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop); public static Bitmap CopyGraphicsContent(Graphics source, Rectangle rect) { Bitmap bmp = new Bitmap(rect.Width, rect.Height); using (Graphics dest = Graphics.FromImage(bmp)) { IntPtr hdcSource = source.GetHdc(); IntPtr hdcDest = dest.GetHdc(); BitBlt(hdcDest, 0, 0, rect.Width, rect.Height, hdcSource, rect.X, rect.Y, TernaryRasterOperations.SRCCOPY); source.ReleaseHdc(hdcSource); dest.ReleaseHdc(hdcDest); } return bmp; }