C# winforms : graphics. DrawImage 问题

标签 c# winforms gdi+

我对 Graphics.DrawImage 方法有一个非常奇怪的问题。

我在 Panel 控件中有 PictureBox 控件,AllowScroll property = true。 该程序根据用户选择的区域将图像切割成小部分。

我加载 300x547 图像并选择区域(红色矩形):

alt text

程序正确切割图像:

alt text

然后,我加载另一张 427x640 图像:

alt text http://img34.imageshack.us/img34/7950/56727000.png

然后,结果我看到图像没有正确剪切。每个 img.jpg 文件都有适当的宽度和高度,但绘制的图像太小: alt text

这是代码片段 - 它保存了用户选择的位图区域:

  Image OriginalIMG= (Image)((PictureBox)panel1.Controls["picBox"]).Image.Clone()
  Bitmap bmp = new Bitmap(selectedAreaRECT.Width, selectedAreaRECT.Height);
  Graphics g = Graphics.FromImage(bmp);

  g.DrawImage(OriginalIMG, 0,0, selectedAreaRECT, GraphicsUnit.Pixel);
  g.Save();
  g.Dispose();

  bmp.Save(AppDomain.CurrentDomain.BaseDirectory + @"\Temp\" + "img1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

如您所见,图像 A 和图像 B 中的 img1.jpg 的代码相同。 我试图解决那个愚蠢的问题太久了,我不知道那个问题的原因是什么。我尝试了 DrawImage 方法的不同重载,但没有成功

编辑

已解决! System.Drawing.Bitmap 的默认 DPI 值为 = 96,如果我使用 DPI != 96 打开图像,则会出现上述问题。要摆脱它,我需要使用 SetResolution 方法:

Bitmap result = new Bitmap(width, height);
result.SetResolution(OriginalIMG.HorizontalResolution, OriginalIMG.VerticalResolution);

解决了问题:) 感谢大家的帮助! :)

最佳答案

我会尝试: (已编辑)

  g.DrawImage(
    OriginalIMG,
    new Rectangle( Point.Empty, bmp.Size ),
    selectedAreaRECT.X, selectedAreaRECT.Y,
    selectedAreaRECT.Width, selectedAreaRECT.Height, 
    GraphicsUnit.Pixel);

看看它是否有所作为。

尽管它与您的问题无关:您忘记了 .Dispose() 一些东西,而且我不确定为什么您必须 .Clone() 图像。

关于C# winforms : graphics. DrawImage 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2681813/

相关文章:

c# - 限制TextBox Visual Studio C#的内容

winapi - 如何使用 MFC 或 GDI 或 GDI+ 为位图中的所有像素设置 alpha 值

c# - C# 中的 C 方法 Fread() 等效项

c# - WPF - 自动调整所有文本的大小

c# - Cross Thread错误处理形式与Timer

c# - MDI 子窗体似乎让父窗体的控件显示为透明

c# - 如何对绑定(bind)到 WinForm 列表的 DataGridView 中的列进行排序?

c# - Graphics.ScaleTransform 的替代品

c# - 将图像切成小块

c# - 使用画笔和钢笔的指南