Code Bye

c# 如何高质量截取指定位置图片

项目需求是这样的, 软件有一个绘图区域 如画布 600*6000 ,用户在此画布上绘制完保存时程序要把用户画图所在区域坐标截取出来保存为图片  如 绘制的300*400 的图片, 现在的做法是调用win API 但是发现图片失真,有更好的办法吗?
现有的办法是

 Graphics g1 = this.designer1.CreateGraphics();
            
            Bitmap myImage = new Bitmap(rec.Width, rec.Height, g1);
            Graphics g2 = Graphics.FromImage(myImage);
            IntPtr dc1 = g1.GetHdc();
            IntPtr dc2 = g2.GetHdc();

            BitBlt(dc2, 0, 0, rec.Width, rec.Height, dc1, rec.X, rec.Y, 13369376);             

            g1.ReleaseHdc(dc1);
            g2.ReleaseHdc(dc2);

            g1.Dispose();

            Bitmap map = ImageFormat.toBitmap(myImage, 255);
            //印章图片缓存起来
            Maticsoft.Common.DataCache.SetCache("SealImage", map);
            MessageBox.Show("保存成功");
            f.Dispose();
            f.Close();

绘制的原图

截取的图片

引用 楼主 lihuioooo 的回复:

项目需求是这样的, 软件有一个绘图区域 如画布 600*6000 ,用户在此画布上绘制完保存时程序要把用户画图所在区域坐标截取出来保存为图片  如 绘制的300*400 的图片, 现在的做法是调用win API 但是发现图片失真,有更好的办法吗?
现有的办法是

 Graphics g1 = this.designer1.CreateGraphics();
            
            Bitmap myImage = new Bitmap(rec.Width, rec.Height, g1);
            Graphics g2 = Graphics.FromImage(myImage);
            IntPtr dc1 = g1.GetHdc();
            IntPtr dc2 = g2.GetHdc();

            BitBlt(dc2, 0, 0, rec.Width, rec.Height, dc1, rec.X, rec.Y, 13369376);             

            g1.ReleaseHdc(dc1);
            g2.ReleaseHdc(dc2);

            g1.Dispose();

            Bitmap map = ImageFormat.toBitmap(myImage, 255);
            //印章图片缓存起来
            Maticsoft.Common.DataCache.SetCache("SealImage", map);
            MessageBox.Show("保存成功");
            f.Dispose();
            f.Close();

绘制的原图

截取的图片

试试调用屏幕截图,然后再截取相应大小和位置的图片试试

myImage你把它保存了不就好了。
先把你转换完的bmp显示出来,看什么样
看到底是转换的问题,还是保存的问题
还有,能直接保存的,就别转来转去的了
来回转格式,不失真才怪呢
引用 4 楼 Z65443344 的回复:

还有,能直接保存的,就别转来转去的了
来回转格式,不失真才怪呢

截图图片来自于   Bitmap map = ImageFormat.toBitmap(myImage, 255);
因为要处理成单色图,所以需要有一次转换

楼猪尿血了。。。

试试调用屏幕截图,然后再截取相应大小和位置的图片试试

请问版主屏幕截图如何实现呢?

20分
既然用DotNet就要用它先进的地方,一行Bitmap.Clone代码就可以搞定:
Bitmap bmp = new Bitmap(@"c:\temp\penguins.jpg");
Bitmap bmp2 = bmp.Clone(new Rectangle(100, 100, 300, 200), bmp.PixelFormat);
bmp2.Save(@"c:\temp\bmp2.jpg");
楼猪,你要自己动脑子多想。。。。
我也在学习研究学习。
是不是图片格式不适合? 用PNG试试。
20分
直接保存的,就别转来转去的
引用 8 楼 Forty2 的回复:

既然用DotNet就要用它先进的地方,一行Bitmap.Clone代码就可以搞定:

Bitmap bmp = new Bitmap(@"c:\temp\penguins.jpg");
Bitmap bmp2 = bmp.Clone(new Rectangle(100, 100, 300, 200), bmp.PixelFormat);
bmp2.Save(@"c:\temp\bmp2.jpg");

老师,,你是高手。。膜拜中。。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# 如何高质量截取指定位置图片