我对 Graphics.DrawImage 方法有一个非常奇怪的问题。
我在 Panel 控件中有 PictureBox 控件,AllowScroll property = true。 该程序根据用户选择的区域将图像切割成小部分。
我加载 300x547 图像并选择区域(红色矩形):
程序正确切割图像:
然后,我加载另一张 427x640 图像:
alt text http://img34.imageshack.us/img34/7950/56727000.png
然后,结果我看到图像没有正确剪切。每个 img.jpg 文件都有适当的宽度和高度,但绘制的图像太小:
这是代码片段 - 它保存了用户选择的位图区域:
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/