C#如何用GDI+实现对图形的多边形输出

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近客户提出个小需求,把输入的图片截成六角形输出,于是上网找了下资料结合自己弄过的一些例子,做了出来.顺便放在这里.以备以后方便查阅.如果刚好可以帮到谁的.那就最好了,好了,废话少说,贴代码:(需要源码的可以到我的资源里找)

 private void CreateMultiAnglePic(string sourceFile,string targetFile)
        {
            Bitmap image = new Bitmap(sourceFile);
            Bitmap resultImage = new Bitmap(image.Width, image.Height);

            //建立缓冲图片
            Graphics gr = Graphics.FromImage(resultImage);
            gr.Clear(Color.FromArgb(0, Color.Transparent));

            Rectangle resultRectangle = new Rectangle(0, 0, image.Width, image.Height);
            int width = image.Width;
            int height = image.Height;
            int yy = height / 2;
            int xx = 0;
            Point[] myArray =
             {
                 new Point(xx, yy),
                 new Point(Convert.ToInt32(yy*0.75), xx),
                 new Point(width-Convert.ToInt32(yy*0.75),xx),
                 new Point(width, yy),
                 new Point(width-Convert.ToInt32(yy*0.75), height),
                 new Point(Convert.ToInt32(yy*0.75), height),       
                 new Point(xx, yy),
             };

            Region reg = new Region();
            reg.MakeEmpty();
            GraphicsPath gp = new GraphicsPath();
            gp.AddPolygon(myArray);
            reg.Union(gp);

            gr.SetClip(reg, CombineMode.Replace);
            gr.DrawImage(image, resultRectangle);

            resultImage.Save(targetFile, ImageFormat.Png);

            gp.Dispose();
            reg.Dispose();
        }

 

比较乱.不过只是做个参考,修修改改的自己来吧.这里有个技巧,当输出是PNG格式的时候背景透明的效果才能在PHOTOSHOP看的出来,如果是JPG的.会发现背景是黑色的.

 

修改:

现在需求又变了(咋总给我碰到=,=),需要把六角型的图连起来,恩..其实也有点意思.废话不说.上码:

    /// <summary>
        /// 把六角图连接起来
        /// </summary>
        /// <param name="sourceFile"></param>
        /// <param name="targetFile"></param>
        private void createComposePic(string sourceFile, string targetFile)
        {
            Bitmap image = new Bitmap(sourceFile);
            Bitmap resultImage = new Bitmap(image.Width * 8, image.Height * 4);
            int width = image.Width;
            int height = image.Height;
            //int xx = width /4;
            //int yy = height/2;
            int xx = 0;
            int yy = 0;

            float extWidth =(float) width * 3/4;
            float extHeight = (float)(height * 0.433);


            //建立缓冲图片
            Graphics gr = Graphics.FromImage(resultImage);
            gr.Clear(Color.FromArgb(255, Color.White));

            int ii = 0;
            List<g> lists = new List<g>();

            g tmpg = new g();

            int tmpXX = 0;
            int tmpYY = 0;

            while (true)
            {
                gr.ResetTransform();
     
                if (ii%2==0)
                {
                    gr.TranslateTransform(extWidth * ii, 0);
                    gr.DrawImage(image, xx, yy);               
                    tmpXX = Convert.ToInt32(xx + extWidth * ii);
                    tmpYY = yy;
                    tmpg = GetCoordinate(image.Height, image.Width, tmpXX, tmpYY);
                    lists.Add(tmpg);

                    gr.DrawImage(image, xx, Convert.ToInt32(height * 0.866 + yy));
                    tmpXX = Convert.ToInt32(xx + extWidth * ii);
                    tmpYY = yy+Convert.ToInt32(height * 0.866 + yy);
                    tmpg = GetCoordinate(image.Height, image.Width, tmpXX, tmpYY);
                    lists.Add(tmpg);

                    gr.DrawImage(image, xx, Convert.ToInt32(height * 0.866 * 2 + yy));
                    tmpXX = Convert.ToInt32(xx + extWidth * ii);
                    tmpYY = yy+Convert.ToInt32(height * 0.866 * 2 + yy);
                    tmpg = GetCoordinate(image.Height, image.Width, tmpXX, tmpYY);
                    lists.Add(tmpg);
                }
                else
                {
                    gr.TranslateTransform(extWidth * ii, extHeight);
                    gr.DrawImage(image, xx, yy);
                    tmpXX = Convert.ToInt32(xx + extWidth * ii);
                    tmpYY = Convert.ToInt32(yy + extHeight);
                    tmpg = GetCoordinate(image.Height, image.Width, tmpXX, tmpYY);
                    lists.Add(tmpg);

                    gr.DrawImage(image, xx, Convert.ToInt32(height * 0.866 + yy));
                    tmpXX = Convert.ToInt32(xx + extWidth * ii);
                    tmpYY = Convert.ToInt32(yy + extHeight + Convert.ToInt32(height * 0.866 + yy));
                    tmpg = GetCoordinate(image.Height, image.Width, tmpXX, tmpYY);
                    lists.Add(tmpg);
                }
                ii++;
                if (extWidth*ii>width*7)
                {
                    if (lists.Count>0)
                    {
                        string ss = string.Empty;
                        foreach (g gi in lists.ToArray())
                        {
                            ss += gi.ToString() + "/r/n";
                        }
                        this.textBox1.Text = ss;
                        DrawTestPic(lists.ToArray(), image);
                    }
                   
                    break;
                }

 

            }
            resultImage.Save(targetFile, ImageFormat.Jpeg);


        }

        /// <summary>
        /// 测试画的图是否符合要求的连接起来
        /// </summary>
        /// <param name="pics"></param>
        /// <param name="img"></param>
        private void DrawTestPic(g[] pics,Bitmap img)
        {
            string targetf = AppDomain.CurrentDomain.BaseDirectory + @"/" + "bb2_Compose_test.jpg";
            Bitmap image = img;
            Bitmap resultImage = new Bitmap(image.Width * 8, image.Height * 4);
            Graphics gr = Graphics.FromImage(resultImage);     
            gr.Clear(Color.FromArgb(255, Color.White));
            Rectangle resultRectangle = new Rectangle(0, 0, resultImage.Width, resultImage.Height);
            GraphicsPath gp = new GraphicsPath();
            for (int i = 0; i < pics.Length; i++)
            {              
                Point[] pp = new Point[] {
                 pics[i].One,
                 pics[i].Two,
                 pics[i].Three,
                 pics[i].Four,
                 pics[i].Five,
                 pics[i].Six,       
                 pics[i].One
                    };
                gp.AddPolygon(pp);

            }
            gr.DrawPath(Pens.Black, gp);         
            resultImage.Save(targetf, ImageFormat.Jpeg);
            gp.Dispose();

        }

        private g GetCoordinate(int height, int width, int tmpx, int tmpy)
        {
            g tmpg = new g();
            int tmpXX = tmpx;
            int tmpYY = tmpy;

            tmpg.One = new Point(tmpXX, tmpYY + height / 2);
            tmpg.Two = new Point(tmpXX + width / 4, Convert.ToInt32(tmpYY + height * 0.067));
            tmpg.Three = new Point(tmpXX + width * 3 / 4, Convert.ToInt32(tmpYY + height * 0.067));
            tmpg.Four = new Point(tmpXX + width, tmpYY + height / 2);
            tmpg.Five = new Point(tmpXX + width * 3 / 4, Convert.ToInt32(tmpYY + height * 0.933));
            tmpg.Six = new Point(tmpXX + width / 4, Convert.ToInt32(tmpYY + height * 0.933));

            return tmpg;
        }


        private void CreateMultiAnglePic(string sourceFile,string targetFile,int style)
        {
            Bitmap image = new Bitmap(sourceFile);
            Bitmap resultImage = new Bitmap(image.Width, image.Height);

            //建立缓冲图片
            Graphics gr = Graphics.FromImage(resultImage);
            //gr.Clear(ColorTranslator.FromHtml("#00FF00"));
            gr.Clear(Color.FromArgb(0, Color.Transparent));

            Rectangle resultRectangle = new Rectangle(0, 0, image.Width, image.Height);
            //gr.FillRectangle(Brushes.Transparent, resultRectangle);

            int width = image.Width;
            int height = image.Height;
            //int yy = height / 2;
            //int xx = 0;
            //Point[] myArray =
            // {
            //     new Point(xx, yy),
            //     new Point(Convert.ToInt32(yy*0.75), xx),
            //     new Point(width-Convert.ToInt32(yy*0.75),xx),
            //     new Point(width, yy),
            //     new Point(width-Convert.ToInt32(yy*0.75), height),
            //     new Point(Convert.ToInt32(yy*0.75), height),       
            //     new Point(xx, yy),
            // };
         
            Region reg = new Region();
            reg.MakeEmpty();
            GraphicsPath gp = new GraphicsPath();
            if (style!=Circle)
            {
                Point[] myArray = GetArrayForViewStyle(style, width, height);
                gp.AddPolygon(myArray);
            }
            else
            {
                gp.AddEllipse(0, 0, width, height);
            }
            reg.Union(gp);

            gr.SetClip(reg, CombineMode.Replace);
            gr.DrawImage(image, resultRectangle);

            resultImage.Save(targetFile, ImageFormat.Png);

            gp.Dispose();
            reg.Dispose();
        }

        private Point[] GetArrayForViewStyle(int angleStyle,int width,int height)
        {
            Point[] tmp = new Point[] { };
            int yy = height / 2;
            int xx = 0;
            switch (angleStyle)
            {
                case SixAngle:
                    tmp=new Point[] {
                 new Point(xx, yy),
                 new Point(Convert.ToInt32(width*0.25), Convert.ToInt32(yy*0.134)),
                 new Point(Convert.ToInt32(width*0.75),Convert.ToInt32(yy*0.134)),
                 new Point(width, yy),
                 new Point(Convert.ToInt32(width*0.75), Convert.ToInt32(yy*1.866)),
                 new Point(Convert.ToInt32(width*0.25), Convert.ToInt32(yy*1.866)),       
                 new Point(xx, yy)
                    };
                    break;
                case ThreeAngle:
                    tmp = new Point[] {
                 new Point(0, 0),
                 new Point(width, 0),
                 new Point(width/2,height),
                 new Point(0, 0)
                    };
                    break;
                case FourAngle:
                    tmp = new Point[] {
                 new Point(xx, yy),
                 new Point(width/2, xx),
                 new Point(width,yy),
                 new Point(width/2, height),  
                 new Point(xx, yy)
                    };
                    break;
            }
            return tmp;
        }

 

 

基本符合要求,而且还附加了切割成三角形和菱形的.

C# GDI+技术 GDI+GDI(即Windows早期版本中附带的Graphics Device Interface)的后继者。它是一种构成Windows XP操作系统的子系统的应用程序编程接口(API)。 阅读详情

相关推荐

利用GDI+绘制任意边数的多边形窗体

最近用C#GDI编程做了几个小游戏,大概知道了这些2D小游戏的基本开发方法.以后我可能不会再蠢到在一个窗体上拖或者是用代码动态生成几十个picturebox控件来制作游戏了,233333...(当然明智之举还是用游戏引擎制作游戏,效率更高) 说些题外话,通过做这几个小游戏(有井字棋、泡泡堂等),我真正认识到了面向对象编程的强大,并强烈认为我小时候用vb控件拖出来的那个游戏(虽然看上去不错,但体

kiruen的博客 2217

testimg_c#GDI_GDI_鼠标拖动调整大小旋转_矩形_

c# gdi 矩形,鼠标操作调整矩形的大小、拖拽移动、 鼠标拖动任意角度旋转功能。

利用GDI绘制任意边数的多边形窗体

最近用C#GDI编程做了几个小游戏,大概知道了这些2D小游戏的基本开发方法.以后我可能不会再蠢到在一个窗体上拖或者是用代码动态生成几十个picturebox控件来制作游戏了...(当然明智之举还是用游戏引擎制作游戏,效率更高) 说些题外话,通过做这几个小游戏(有井字棋、泡泡堂等),我真正认识到了面向对象编程的强大,并强烈认为我小时候用vb控件拖出来的那个游戏(虽然看上去不错,但体积超大,性能弱

oqqPony1的博客 1286

鼠标操作矩形框GDI绘图可放大缩小,拖动矩形框

鼠标操作矩形框GDI绘图可放大缩小,拖动矩形框,

C#GDI+实现图形图像的任意变形效果?

如何实现类似PHOTOSHOP中的图像任意变形效果,目前GDI+可以轻松实现由长方形变成任意平行四边形,但无法轻意解决变成梯形、三角形和任意四边形。例如下例:扭曲变形效果之一:扭曲变形效果之二:在下一代操作系统Vista中, 图形图像通过WPF的三维映射相应方式可以解决此问题(见我的一篇文章:在Expression Blend中制作侧面为梯形的类棱柱体),但有没有更直接的算法来解决此问题呢?经过搜

祝紫山(大可山人)博客[GDI+,WPF, .Net图形图像] 1万+

C# 生成多种图案的几何图形 生成正方形、剪刀形、椭圆、三角形等多边形图案。

C# 生成多种图案的几何图形 C#生成多种图案的几何图形,生成正方形、剪刀形、椭圆、三角形等多边形图案。

动态规划法——凸多边形最优三角划分

再看上图b的图形,假如要在这个图形中得到最优子结构,即权值和最小,那么如果把这个n边形分成两个子多边形+一个三角形,那么这两个子多边形各自所划分的结构也应当是最优子结构,因为整体最优那么部分一定也是最优,否则如果部分有更优结构,整体就不会是最优结构。t[i][k]代表Vi-1~Vk的图形,t[k+1][j]代表Vk~Vj的图形,w(Vi-1VkVj)代表它们分出的三角形,三者之和正好为我们所求的划分权值之和,遍历所有分割方式取其中最小值即为最优值。

milu_ELK的博客 1297

C# GDI+图形绘制与图像缩放示例

在计算机图形学中,一个多边形是由一系列的顶点和连接这些顶点的线段定义的二维图形多边形的定义非常广泛,任何封闭的由直线构成的图形都可以被称作多边形。从三角形到无限边的多边形,其性质也随着边数的变化而有所不同。然而,所有多边形都具有一些基本的性质,例如顶点数目等于边的数目,多边形的内角和可以用公式 (n-2)*180 度计算,其中 n 是边数。在处理图像时,经常需要对图像进行缩放操作,这可能是为了适应不同的显示需求或为了优化图像加载速度。图像缩放技术通过调整图像的像素数量来改变图像的尺寸。

weixin_36235398的博客 1179

C# Winform GDI+ 绘图

Graphics类是GDI+技术的一个基本类。GDI+(Graphics Device Interface)是.NET框架的重要组成部分,提供对二维图形图像和文字排版处理的支持。System.Drawing.Drawing2D: 提供了高级的二维和矢量绘图功能(比如渐变、 图案填充、- 轨迹等)System.Drawing:提供了最基本的绘图功能(比如画直线、矩形、椭圆等);System.Drawing.Printing: 提供与打印相关的服务。System.Drawing.Text: 提供排版功能。

熊思雨的博客 1万+

计算机图形c#实现 多边形相关算法

计算机图形c#实现 多边形相关算法 1.鼠标画多边形 画图首先需要画板,即GDI+的Graphics类。 为了在全局中使用Graphics类。 首先定义全局变量 ​ List pt1 = new List(); 记录鼠标点击的点坐标 ​ int num1 = 0; 记录个数 ​ Point mouseLocation; 记录鼠标移动的坐标 ​ Graphics g; 定义画图类 往界面中拖入pictureBox1,添加事件pictureBo

XIONGDA的博客 3007

C#实现的二维多边形碰撞检测技术详解

在计算机图形学和游戏开发领域,碰撞检测指的是判断两个物体是否在空间中接触或相互穿透的过程。二维多边形碰撞检测则专注于在二维平面上,使用算法分析和处理多边形之间的交互关系。对于游戏开发者而言,它是最基本且重要的技术之一,用来确保游戏世界的物理真实性和提高玩家的游戏体验。GDI+(Graphics Device Interface Plus)是微软开发的一个2D图形库,属于.NET Framework的一部分,提供了丰富的API用于图像处理、图形绘制、文本输出以及对图像和图形进行变换和格式转换等任务。

weixin_42602726的博客 910

三角化多边形算法(C#

运用循环单链表存储节点信息,利用向量叉积判断当前节点是不是凸点,是的话就把前后两个点输出来,构成一个三角形,删除本节点,否的话就什么也不做,知道剩下三个节点或者都是凹点。

C#实现图像变形(扭曲、水波纹、B样条)

C#实现图像变形(扭曲、水波纹、B样条),图片大小要求512*512

C#中的GDIGDI+(Graphics Device Interface Plus)图形设备接口

GDI(Graphics Device Interface)是微软Windows操作系统中的一个组件,它提供了一组API,用于在显示器或打印机等图形设备上进行图形绘制和图像处理。GDI 是 Windows 编程中用于。

去追随使你安宁的东西,去做你觉得有用的事情 2573

C# GDI+鼠标绘制图形及缩放DEMO深度解析

画笔(Pen)是GDI+中用于绘制线条和轮廓的对象。它可以用来定义线条的粗细、颜色、样式等属性。在实际应用中,画笔的类型决定了图形外观的许多方面。

weixin_35973118的博客 854

C# GDI绘图

GDI+指的是.NET Framework 4.0中提供二维图形、图像处理等功能,是构成Windows操作系统的一个子系统,它提供了图形图像操作的应用程序编程接口(API)。使用GDI+可以用相同的方式在屏幕或打印机上显示信息,而无须考虑特定显示设备的细节。GDI+类提供程序员用以绘制的方法,这些方法随后会调用特定设备的驱动程序。GDI+将应用程序与图形硬件分隔,使程序员能够创建与设备无关的应用程序。GDI+主要用于在窗体上绘制各种图形图像,可以用于绘制各种数据图形、数学仿真等。

钢铁男儿 1374

C#图形编程GDI+基础

    很长一段时间没有更新技术博客了,最近在用C#开发Kinect的程序。所以跟大家分享一下自己一些方面学习和认知。       编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数。GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种...

JavaFresh 1037

C# .NET与GDI+图形界面编程:可组态程序源码解析

GDI+,即图形设备接口增强版,是.NET框架中用于图形处理的一套应用程序接口(API)。其核心目标是提供强大的图形、图像、文本渲染能力,以及视觉效果处理功能。GDI+主要由以下几个部分组成:基本图形绘制:提供绘制基本图形如线条、矩形、椭圆和多边形的接口。路径与形状:提供路径(Path)对象,能够创建复杂的形状和轮廓。纹理和位图:处理图像,支持不同格式的位图,并且可以应用到图形和形状中。文本渲染:支持多种字体、样式以及字符间距的调整,实现文本的精细布局。

weixin_42453228的博客 1049

C#GDI+实现交互式CAD系统:动态绘图详解

本文还有配套的精品资源,点击获取 简介:本文介绍了如何利用C#语言和GDI+图形库创建基础交互式CAD系统,实现动态图形绘制。我们详细讨论了图形对象的创建与绘制、用户交互处理、动态绘图技术、圆弧绘制的特殊考虑、错误处理、系统优化以及VS2010开发环境的使用。通过这些技术要点,读者可以学习如何构建一个功能完善的图形应用程序。 1. C#语言及GDI+图形库基础 ...

weixin_36427956的博客 1693
上一篇: C# 快捷键 设计
simonllf
博客等级 码龄23年 23粉丝 35原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值