'BitmapEncoder'에 해당되는 글 1건

  1. 2010.05.08 [ WPF ] 이미지 그림판 2
Window/WPF2010. 5. 8. 18:13

이미지를 불러와 간단한 꾸미기를 하고 저장하는 예제에 대해 포스팅하겠습니다.

예전 해당 영역을 이미지로 저장하는 포스팅의 내용을 약간 수정한 내용입니다.

 

간략적으로,

InkCanvas를 사용해 그림을 그리고 DrawingVisualDrawingContext를 통해

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. 저장된 이미지

 

'Window > WPF' 카테고리의 다른 글

[ WPF ] 윈도우 이벤트  (4) 2010.07.11
[ WPF ] OpenCV로 캠 화면 띄우기  (3) 2010.06.20
[ WPF ] UI 쓰레드 변경하기  (0) 2010.05.04
[ WPF ] WPF in Flash  (0) 2010.04.29
[ WPF ] 클래스 구조  (0) 2010.04.27
Posted by 열ㅇl