[C# - WPF] Bitmap위에 도형 그리는 방법 두가지C#/WPF2022. 6. 16. 19:41
Table of Contents
안녕하세요, 반나무입니다.
Bitmap위에 도형을 그리는 방법 두가지를 열심히 찾아서 소개합니다.
1. BitmapImage를 출력하고 ZIndex로 위에 BitmapSource로 도형을 그린 이미지를 올린다.
2. Bitmap에 Graphics로 도형을 그려 출력한다.
우선 기본적인 바인딩은 다 적용했다는 가정하에 시작하겠습니다.
저는 일반적인 바인딩 방법을 사용했습니다.
1. ZIndex방법
<Grid>
<Image Source="{Binding SourceImage}" Panel.ZIndex="10"/>
<Image Source="{Binding DisplayImage}"/>
</Grid>
MainWindow.xaml
using System.Windows.Media.Imaging;
using System.Windows.Media;
// 로컬 이미지 가져오기
MyBitmap = new Bitmap("D://hello.bmp");
// 이미지 사이즈로 도형을 새로 그린다.
RenderTargetBitmap rtb = new RenderTargetBitmap(MyBitmap.Width, MyBitmap.Height, 96d, 96d, PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
// 투명한 Background의 도형이미지 그리기
dc.DrawRoundedRectangle(System.Windows.Media.Brushes.Transparent, new System.Windows.Media.Pen(System.Windows.Media.Brushes.Red,10), new System.Windows.Rect(100, 100, 100, 100), 0, 0);
dc.Close();
rtb.Render(dv);
if (rtb.IsFrozen)
rtb.Freeze();
}
// 도형 이미지 바인딩 출력
SourceImage = rtb;
// 이미지 바인딩 출력
DisplayImage = BitmapToBitmapImage(MyBitmap.Clone() as Bitmap);
MainViewModel.cs
여기서 Bitmap의 가로,세로 크기는 장치독립적인 값으로 96 dpi로 계산된값임 만약 dpi를 변경한다면 가로,세로 크기도 동일하게 변경해줘야 한다.
bitmap의 가로크기 = bitmap 가로픽셀 수 x dpi X / 96
bitmap의 세로크기 = bitmap 세로픽셀 수 x dpi Y / 96
2. 이미지 합성
using System.Windows.Media;
// 로컬 이미지 가져오기
MyBitmap = new Bitmap("D://hello.bmp");
// Bitmap 생성
Bitmap bitmap = new Bitmap(MyBitmap.Width, MyBitmap.Height);
// 펜 생성
System.Drawing.Pen redPen = new System.Drawing.Pen(System.Drawing.Brushes.Red, 10);
using (Graphics g = Graphics.FromImage(bitmap))
{
// 이미지 그리기
g.DrawImage(MyBitmap, 0, 0, MyBitmap.Width, MyBitmap.Height);
// 도형 그리기 - X,Y좌표입력 후 100x100 사각형을 그림
g.DrawRectangle(redPen, new Rectangle(MyBitmap.Width / 2, MyBitmap.Height / 2, 100, 100));
}
// 바인딩
DisplayImage = BitmapToBitmapImage(bitmap.Clone() as Bitmap);
// Dispose
redPen.Dispose();
bitmap.Dispose();
MainViewModel.cs
이미지 합성방법은 정말 중요한 문제가있다!!
이미지를 먼저 그린다음 그림을 그려야한다
그렇지않으면 그림을 그린다음 이미지가 그려져 그림이 묻히게된다.
반응형
'C# > WPF' 카테고리의 다른 글
[C# - WPF] View Binding 자동 완성 방법, F12로 ViewModel 타고 가기 (1) | 2024.04.28 |
---|---|
[C# - WPF] 2. MVVM방식으로 바인딩 하기 (0) | 2022.07.15 |
[C# - WPF] MessageBox 아이콘 및 분기 총 정리 (0) | 2022.07.02 |
[C# - WPF] 1. WPF 프로젝트를 처음 시작해보자 (0) | 2021.11.10 |
[C# - WPF] 0. WPF와 MVVM란? (0) | 2021.11.10 |
@반나무 :: 반나무_뿌리
3년차 WPF 개발자입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!