[ WPF ] 이미지 그림판
이미지를 불러와 간단한 꾸미기를 하고 저장하는 예제에 대해 포스팅하겠습니다.
예전 해당 영역을 이미지로 저장하는 포스팅의 내용을 약간 수정한 내용입니다.
간략적으로,
InkCanvas를 사용해 그림을 그리고 DrawingVisual과 DrawingContext를 통해
RenderTargetBitmap으로 변환 후 이를 BitmapEncoder를 사용해 해당 포맷에 맞게 저장합니다.
InkCanvas를 이미지로 변환 후 저장하기 때문에
꾸미기 용도에 맞게 자식 객체로 여러가지를 포함시킨 후 저장하셔도 되겠죠.^^
이제, 소스를 통해 하나씩 알아보겠습니다.
1. 이미지를 InkCanvas의 Background로 지정합니다.
// 이미지 불러오기 private void btn_Open(object sender, RoutedEventArgs e) { OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog() == true) { if (File.Exists(openDialog.FileName)) { BitmapImage bitmapImage = new BitmapImage(new Uri(openDialog.FileName, UriKind.RelativeOrAbsolute));
// InkCanvas의 배경으로 지정 inkCanvas.Background = new ImageBrush(bitmapImage); } } } |
2. 해당 객체(InkCanvas)를 비트맵으로 변환합니다.
// 해당 객체를 이미지로 변환
private static RenderTargetBitmap ConverterBitmapImage(FrameworkElement element) { DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen();
// 해당 객체의 그래픽요소로 사각형의 그림을 그립니다. drawingContext.DrawRectangle(new VisualBrush(element), null, new Rect(new Point(0, 0), new Point(element.ActualWidth, element.ActualHeight)));
drawingContext.Close();
// 비트맵으로 변환합니다. RenderTargetBitmap target = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
target.Render(drawingVisual); return target; } |
3. 변환된 이미지를 해당 포맷에 맞게 저장합니다.
// 해당 이미지 저장
private static void ImageSave(BitmapSource source) { SaveFileDialog saveDialog = new SaveFileDialog();
// 이미지 포맷들 saveDialog.Filter = "PNG|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp"; saveDialog.AddExtension = true;
if (saveDialog.ShowDialog() == true) { BitmapEncoder encoder = null; // 파일 생성 FileStream stream = new FileStream(saveDialog.FileName, FileMode.Create, FileAccess.Write);
// 파일 포맷 string upper = saveDialog.SafeFileName.ToUpper(); char[] format = upper.ToCharArray(saveDialog.SafeFileName.Length - 3, 3); upper = new string(format);
// 해당 포맷에 맞게 인코더 생성 switch (upper.ToString()) { case "PNG": encoder = new PngBitmapEncoder(); break;
case "JPG": encoder = new JpegBitmapEncoder(); break;
case "GIF": encoder = new GifBitmapEncoder(); break;
case "BMP": encoder = new BmpBitmapEncoder(); break; } // 인코더 프레임에 이미지 추가 encoder.Frames.Add(BitmapFrame.Create(source)); // 파일에 저장 encoder.Save(stream); stream.Close(); } } |
결과 화면은 다음과 같습니다.
1. 이미지를 불러옵니다.
2. 간단히 꾸미기를 하고 저장합니다.
3. 저장된 이미지