none
C# Image에 '부드러운 가장자리' 효과 적용 RRS feed

  • 질문

  • 파워포인트에 있는 이미지 수정 기능 중 '부드러운 가장자리' 효과는

    C#의 이미지에 어떻게 부여할 수 있는지 궁금해서 질문 올립니다.

    2016년 11월 15일 화요일 오전 1:45

모든 응답

  • 위와 같은 PowerPoint의 '부드러운 가장자리' 효과를 적용한 소스의 예를 제공해 드립니다.

    먼저 다음 같은 작업이 선행되어야 합니다.

    1. VisualStudio에 WindowsForms 프로젝트 생성

    2. 폼에 PictureBox 컨트롤 추가

    3. PictureBox.Image 속성 설정(이미지가 미리 설정되어 있어야 합니다.)

    4. [프로젝트 속성]에서 [빌드] 탭에서 [안전하지 않은 코드 허용]

    소스 예제 입니다.

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    
    namespace WindowsFormsApplication1
    {
    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		private void Form1_Load(object sender, EventArgs e)
    		{
    			Bitmap bmpFluffy = new Bitmap(pictureBox1.Image);
    			Rectangle r = new Rectangle(Point.Empty, bmpFluffy.Size);
    
    			using (Bitmap bmpMask = new Bitmap(r.Width, r.Height))
    			using (Graphics g = Graphics.FromImage(bmpMask))
    			using (GraphicsPath path = createRoundRect(
    				r.X, r.Y,
    				r.Width, r.Height,
    				Math.Min(r.Width, r.Height) / 5))
    			using (Brush brush = createFluffyBrush(
    				path,
    				new float[] { 0.0f, 0.1f, 1.0f },
    				new float[] { 0.0f, 0.95f, 1.0f }))
    			{
    				g.FillRectangle(Brushes.Black, r);
    				g.SmoothingMode = SmoothingMode.HighQuality;
    				g.FillPath(brush, path);
    				transferOneARGBChannelFromOneBitmapToAnother(
    					bmpMask,
    					bmpFluffy,
    					ChannelARGB.Blue,
    					ChannelARGB.Alpha);
    			}
    			pictureBox1.Image = bmpFluffy;
    		}
    
    		static public GraphicsPath createRoundRect( int x, int y, int width, int height, int radius )
    		{
    			GraphicsPath gp = new GraphicsPath();
     
    			if (radius == 0)
    				gp.AddRectangle( new Rectangle( x, y, width, height ) );
    			else
    			{
    				gp.AddLine( x + radius, y, x + width - radius, y );
    				gp.AddArc( x + width - radius, y, radius, radius, 270, 90 );
    				gp.AddLine( x + width, y + radius, x + width, y + height - radius );
    				gp.AddArc( x + width - radius, y + height - radius, radius, radius, 0, 90 );
    				gp.AddLine( x + width - radius, y + height, x + radius, y + height );
    				gp.AddArc( x, y + height - radius, radius, radius, 90, 90 );
    				gp.AddLine( x, y + height - radius, x, y + radius );
    				gp.AddArc( x, y, radius, radius, 180, 90 );
    				gp.CloseFigure();
    			}
    			return gp;
    		}
    
    		public static Brush createFluffyBrush(
    			GraphicsPath gp,
    			float[] blendPositions,
    			float[] blendFactors )
    		{
    			PathGradientBrush pgb = new PathGradientBrush( gp );
    			Blend blend = new Blend();
    			blend.Positions = blendPositions;
    			blend.Factors = blendFactors;
    			pgb.Blend = blend;
    			pgb.CenterColor = Color.White;
    			pgb.SurroundColors = new Color[] { Color.Black };
    			return pgb;
    		}
    
    		public enum ChannelARGB
    		{
    			Blue = 0,
    			Green = 1,
    			Red = 2,
    			Alpha = 3
    		}
     
    		public static void transferOneARGBChannelFromOneBitmapToAnother(
    			Bitmap source,
    			Bitmap dest,
    			ChannelARGB sourceChannel,
    			ChannelARGB destChannel )
    		{
    			if ( source.Size!=dest.Size )
    				throw new ArgumentException();
    			Rectangle r = new Rectangle( Point.Empty, source.Size );
    			BitmapData bdSrc = source.LockBits( r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb );
    			BitmapData bdDst = dest.LockBits( r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb );
    			unsafe
    			{
    				byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer();
    				byte* bpDst = (byte*)bdDst.Scan0.ToPointer();
    				bpSrc += (int)sourceChannel;
    				bpDst += (int)destChannel;
    				for ( int i = r.Height * r.Width; i > 0; i-- )
    				{
    					*bpDst = *bpSrc;
    					bpSrc += 4;
    					bpDst += 4;
    				}
    			}
    			source.UnlockBits( bdSrc );
    			dest.UnlockBits( bdDst );
    		}
    	}
    }
    다음은 결과물 입니다.




    2016년 11월 25일 금요일 오전 2:12