WPF怎么实现根据任意形状裁剪图片?

nhf2659cdx 2013-01-10 09:57:40
已用pathgeometry做好了选区,选区有矩形、圆形、多边形等等。怎么根据选区来裁剪图片?clip的话图没变,只是显示变了,我现在需要的是裁剪后的图片。纠结好久了,大神们救救我吧,感激!!!
...全文
912 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Struggle_hardllz 2015-06-08
  • 打赏
  • 举报
回复
哥们,图片裁剪搞定了没,给我参考参考,我刚学。
Helen_rui360 2013-07-05
  • 打赏
  • 举报
回复
WPF中的对图片处理仿照美图秀秀的裁剪,怎么做,求回复
「已注销」 2013-02-20
  • 打赏
  • 举报
回复
我想知道如何剪切出来我盖住的那部分呢?
nhf2659cdx 2013-01-11
  • 打赏
  • 举报
回复
沉了,自己顶顶
nhf2659cdx 2013-01-10
  • 打赏
  • 举报
回复
嗯,谢谢啊,估计我就是要遮罩抠图,我再看看
lhx527099095 2013-01-10
  • 打赏
  • 举报
回复
引用 6 楼 nhf2659cdx 的回复:
嗯,path有,可是我想根据path把path那部分图片裁剪出来。用clip根据path裁剪的话显示是没有问题的,但是原图没变,保存出来的还是整张图片
算了 不纠结了 你自己看看吧 大概就是这样 你自己试吧 遮罩可以遮图 也可以抠图 自己搞好了path 画上去就行了
lhx527099095 2013-01-10
  • 打赏
  • 举报
回复
刚刚写个例子 我试了下 可以运行 而且图片生成正常

 public MainWindow()
        {
            InitializeComponent();
            string input_filepath=@"C:\Users\hongxu.lin\Desktop\user_blue.png";
            string output_filepath=@"C:\Users\hongxu.lin\Desktop\user_blue1.png";
            Process(input_filepath, output_filepath);
        }

        bool Process(string input_filepath, string output_filepath)
        {
            // load source image  
            // BitmapSource bitmap = new BitmapImage(new Uri(input_filepath));  
            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri(input_filepath);
            bitmap.CacheOption = BitmapCacheOption.OnLoad;
            bitmap.EndInit();

            // create render bitmap  
            var rtbitmap = new RenderTargetBitmap(bitmap.PixelWidth,
                bitmap.PixelHeight,
                bitmap.DpiX,
                bitmap.DpiY,
                PixelFormats.Default);
            // draw watermark  
            var drawingVisual = new DrawingVisual();
            using (var dc = drawingVisual.RenderOpen())
            {
                // draw source image  
                dc.DrawImage(bitmap, new Rect(0, 0, bitmap.Width, bitmap.Height));
                //draw path
                PathGeometry triangle = new PathGeometry();
                PathFigure pf = new PathFigure();
                pf.StartPoint = new Point(-bitmap.Width / 2, bitmap.Width/2);
                pf.Segments.Add(new LineSegment(new Point(bitmap.Width, bitmap.Width), true));
                pf.Segments.Add(new LineSegment(new Point(bitmap.Width, -bitmap.Width), true));
                triangle.Figures.Add(pf);
                dc.DrawGeometry(
                    Brushes.Red,
                    null,
                    triangle
                    );
            }
            rtbitmap.Render(drawingVisual);
            var bitmapEncoder = new PngBitmapEncoder();
            bitmapEncoder.Frames.Add(BitmapFrame.Create(rtbitmap));

            // save image  
            if (File.Exists(output_filepath))
                File.Delete(output_filepath);

            using (FileStream file = new FileStream(output_filepath, FileMode.Create))
                bitmapEncoder.Save(file);

            // return  
            return true;
        }  

nhf2659cdx 2013-01-10
  • 打赏
  • 举报
回复
嗯,path有,可是我想根据path把path那部分图片裁剪出来。用clip根据path裁剪的话显示是没有问题的,但是原图没变,保存出来的还是整张图片
lhx527099095 2013-01-10
  • 打赏
  • 举报
回复
这样画path 然后和上面画image的用同一 DrawingVisual 然后保存 应该就有了吧 我觉得应该是这样 PathGeometry triangle = new PathGeometry(); PathFigure pf = new PathFigure(); pf.StartPoint = new Point(-this._size, 0); pf.StartPoint = new Point(-this._size, this._size); pf.Segments.Add(new LineSegment(new Point(this._size, this._size), true)); pf.Segments.Add(new LineSegment(new Point(this._size, -this._size), true)); triangle.Figures.Add(pf); using (DrawingContext dc = this._visual.DrawingVisual.RenderOpen()) { dc.DrawGeometry( this._brush, null, triangle ); }
lhx527099095 2013-01-10
  • 打赏
  • 举报
回复
引用 3 楼 nhf2659cdx 的回复:
lhx527099095:dc.DrawImage(bitmap, new Rect(0, 0, bitmap.Width, bitmap.Height)); 我的形状用的pathgeometry。DrawImage里面是根据Rect画的,涉及任意形状,所以只能用pathgeometry,怎么根据pathgeometry重新画出来呢?
在给你点思路吧 DrawingVisual我记得里面是可以画好几层的吧 你先画地下的图片 然后再画上面的遮罩 这样就可以了啊 只是思路 对不对还有待验证 但总觉得这个应该没有那么难 试试看看吧
nhf2659cdx 2013-01-10
  • 打赏
  • 举报
回复
lhx527099095:dc.DrawImage(bitmap, new Rect(0, 0, bitmap.Width, bitmap.Height)); 我的形状用的pathgeometry。DrawImage里面是根据Rect画的,涉及任意形状,所以只能用pathgeometry,怎么根据pathgeometry重新画出来呢?
nhf2659cdx 2013-01-10
  • 打赏
  • 举报
回复
lhx527099095:谢谢回帖!看明白了代码,但是还是没有思路,因为我想从原图里根据形状抠出我要的部分,你这个是加东西...能给点思路不?
lhx527099095 2013-01-10
  • 打赏
  • 举报
回复
首先 你要最终的是裁剪过的图片 只使用图片是没有用的 必须重新画 然后保存 这样才能让你裁剪生效 很久之前写的图片加水印的方法 你要修改的是 画裁剪完的图 然后再保存 只能给你个大概的 具体的你自己敲吧

bool Process(string input_filepath, string output_filepath) // <-- let upper logic determine the output filename, these will provide flexibility  
        {  
            // load source image  
            // BitmapSource bitmap = new BitmapImage(new Uri(input_filepath));  
            BitmapImage bitmap = new BitmapImage();  
            bitmap.BeginInit();  
            bitmap.UriSource = new Uri(input_filepath);  
            bitmap.CacheOption = BitmapCacheOption.OnLoad;  
            bitmap.EndInit();  
  
            // create render bitmap  
            var rtbitmap = new RenderTargetBitmap(bitmap.PixelWidth,  
                bitmap.PixelHeight,  
                bitmap.DpiX,  
                bitmap.DpiY,  
                PixelFormats.Default);  
            // draw watermark  
            var drawingVisual = new DrawingVisual();  
            using (var dc = drawingVisual.RenderOpen())  
            {  
                // draw source image  
                dc.DrawImage(bitmap, new Rect(0, 0, bitmap.Width, bitmap.Height));  
                // determine the render size of the watermark  
                double hs = bitmap.Height * 0.3 / this._waterPic.Height;  
                double ws = bitmap.Width * 0.3 / this._waterPic.Width;  
                double scale = hs > ws ? ws : hs;  
                if (bitmap.Height / bitmap.Width > 5)  
                {  
                    scale = bitmap.Width * 0.8 / this._waterPic.Width;  
                }  
                else if (bitmap.Width / bitmap.Height > 5)  
                {  
                    scale = bitmap.Height * 0.8 / this._waterPic.Height;  
                }  
                double Wstart = bitmap.Width - this._waterPic.Width * scale - 20 < 0 ? 0 : bitmap.Width - this._waterPic.Width * scale - 20;  
                double Hstart = bitmap.Height - this._waterPic.Height * scale;  
                // draw water make  
                dc.DrawImage(this._waterPic, new Rect(Wstart, Hstart, this._waterPic.Width * scale, this._waterPic.Height * scale));  
            }  
            rtbitmap.Render(drawingVisual);  
            var bitmapEncoder = new PngBitmapEncoder();  
            bitmapEncoder.Frames.Add(BitmapFrame.Create(rtbitmap));  
  
            // save image  
            if (File.Exists(output_filepath))  
                File.Delete(output_filepath);  
  
            using (FileStream file = new FileStream(output_filepath, FileMode.Create))  
                bitmapEncoder.Save(file);  
  
            // return  
            return true;  
        }  

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧