이미징 개요
업데이트: 2007년 11월
이 항목에서는 Microsoft Windows Presentation Foundation Imaging Component에 대해 소개합니다. WPF Imaging을 사용하여 개발자는 이미지를 표시하거나 변환하고 형식을 지정할 수 있습니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- WPF 이미징 구성 요소
- WPF 이미지 형식
- WPF에서 이미지 표시
- 이미지 메타데이터
- 코덱 확장성
- 관련 항목
WPF 이미징 구성 요소
WPF Imaging에서는 매우 향상된 Microsoft Windows 이미징 기능을 제공합니다. 비트맵을 표시하거나 공통 컨트롤에 이미지를 사용하는 등의 이미징 기능은 이전에는 Microsoft Windows GDI(그래픽 장치 인터페이스) 또는 Microsoft Windows GDI+ 라이브러리에 의존했었습니다. 이러한 API는 기본적인 이미징 기능을 제공하지만 코덱 확장성 및 고품질 이미지 지원과 같은 기능은 제공하지 않습니다. WPF Imaging은 GDI 및 GDI+의 단점을 극복하고 사용자 응용 프로그램 내에서 이미지를 표시 및 사용할 수 있는 새로운 API 집합을 제공하도록 디자인되었습니다.
WPF Imaging API에는 관리되는 구성 요소와 관리되지 않는 구성 요소를 사용하여 액세스할 수 있습니다. 관리되지 않는 구성 요소는 다음과 같은 기능을 제공합니다.
새 이미지 형식 또는 독점적인 이미지 형식을 위한 확장성 모델
BMP(비트맵), JPEG(Joint Photographics Experts Group), PNG(이동식 네트워크 그래픽), TIFF(Tagged Image File Format), Microsoft Windows 미디어 사진, GIF(Graphics Interchange Format) 및 아이콘(.ico) 등의 네이티브 이미지 형식에 대한 성능 및 보안 개선
채널당 최대 32비트의 높은 비트 수준 이미지 데이터 유지
안전한 이미지 배율 조정, 자르기 및 회전
간단한 색 관리
파일 내의 독점적 메타데이터 지원
관리되는 구성 요소는 관리되지 않는 인프라를 활용하여 UI(사용자 인터페이스), 애니메이션 및 그래픽과 같은 다른 WPF 기능과의 자연스러운 이미지 통합 기능을 제공합니다. 또한 관리되는 구성 요소는 WPF 응용 프로그램에서 새로운 이미지 형식을 자동으로 인식하는 WPF(Windows Presentation Foundation) 이미징 코덱 확장성 모델을 활용합니다.
관리되는 WPF Imaging API의 대부분은 System.Windows.Media.Imaging 네임스페이스에 들어 있습니다. 그러나 ImageBrush 및 ImageDrawing과 같은 일부 중요한 형식은 System.Windows.Media 네임스페이스에 들어 있고, Image는 System.Windows.Controls 네임스페이스에 들어 있습니다.
이러한 항목은 관리되는 구성 요소에 대한 추가 정보를 제공합니다. 관리되지 않는 API에 대한 자세한 내용은 Windows Imaging 구성 요소 설명서를 참조하십시오.
WPF 이미지 형식
코덱은 특정 미디어 형식을 인코딩하거나 디코딩하는 데 사용됩니다. WPF Imaging에서는 BMP, JPEG, PNG, TIFF, Windows 미디어 사진, GIF 및 ICON 이미지 형식에 대한 코덱을 제공합니다. 이러한 각각의 코덱을 사용하여 응용 프로그램은 해당 이미지 형식을 디코딩하고 인코딩(ICON 제외)할 수 있습니다.
BitmapSource는 이미지의 디코딩 및 인코딩에 사용되는 중요한 클래스입니다. 이는 WPF Imaging 파이프라인의 기본 빌딩 블록으로, 특정 크기 및 해상도의 단일 상수 픽셀 집합을 나타냅니다. BitmapSource는 여러 프레임 이미지의 개별 프레임일 수도 있고 BitmapSource에 대해 수행된 변환의 결과일 수도 있습니다. 이는 BitmapFrame과 같은 WPF 이미징에 사용되는 많은 기본 클래스의 부모입니다.
BitmapFrame은 이미지 형식의 실제 비트맵 데이터를 저장하는 데 사용됩니다. 많은 이미지 형식이 하나의 BitmapFrame만을 지원하지만 GIF 및 TIFF는 이미지당 여러 개의 프레임을 지원합니다. 프레임은 디코더에서 입력 데이터로 사용되며, 인코더에 전달되어 이미지 파일을 만듭니다.
다음 예제에서는 BitmapSource에서 BitmapFrame을 만든 다음 TIFF 이미지에 추가하는 방법을 보여 줍니다.
Dim image5 As BitmapSource = System.Windows.Media.Imaging.BitmapSource.Create(width, height, 96, 96, PixelFormats.Indexed1, BitmapPalettes.WebPalette, pixels, stride)
Dim stream5 As New FileStream("palette.tif", FileMode.Create)
Dim encoder5 As New TiffBitmapEncoder()
encoder5.Frames.Add(BitmapFrame.Create(image5))
encoder5.Save(stream5)
BitmapSource image5 = BitmapSource.Create(
width,
height,
96,
96,
PixelFormats.Indexed1,
BitmapPalettes.WebPalette,
pixels,
stride);
FileStream stream5 = new FileStream("palette.tif", FileMode.Create);
TiffBitmapEncoder encoder5 = new TiffBitmapEncoder();
encoder5.Frames.Add(BitmapFrame.Create(image5));
encoder5.Save(stream5);
이미지 형식 디코딩
이미지 디코딩은 이미지 형식을 시스템에서 사용할 수 있는 이미지 데이터로 변환하는 것입니다. 그런 다음 이미지 데이터는 다른 형식을 표시 또는 처리하거나 다른 형식으로 인코딩하는 데 사용될 수 있습니다. 디코더 선택은 이미지 형식에 따라 달라집니다. 코덱은 특정 디코더를 지정하지 않은 한 자동으로 선택됩니다. WPF에서 이미지 표시 단원의 예제에서는 자동 디코딩을 보여 줍니다. 관리되지 않는 WPF Imaging 인터페이스를 사용하여 개발되고 시스템에 등록된 사용자 지정 형식 디코더는 자동으로 디코더 선택에 포함됩니다. 따라서 WPF 응용 프로그램에서 사용자 지정 형식이 자동으로 표시됩니다.
다음 예제에서는 비트맵 디코더를 사용하여 BMP 형식 이미지를 디코딩하는 방법을 보여 줍니다.
' Open a Uri and decode a BMP image
Dim myUri As New Uri("tulipfarm.bmp", UriKind.RelativeOrAbsolute)
Dim decoder2 As New BmpBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim bitmapSource2 As BitmapSource = decoder2.Frames(0)
' Draw the Image
Dim myImage2 As New Image()
myImage2.Source = bitmapSource2
myImage2.Stretch = Stretch.None
myImage2.Margin = New Thickness(20)
// Open a Uri and decode a BMP image
Uri myUri = new Uri("tulipfarm.bmp", UriKind.RelativeOrAbsolute);
BmpBitmapDecoder decoder2 = new BmpBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource2 = decoder2.Frames[0];
// Draw the Image
Image myImage2 = new Image();
myImage2.Source = bitmapSource2;
myImage2.Stretch = Stretch.None;
myImage2.Margin = new Thickness(20);
이미지 형식 인코딩
이미지 인코딩은 이미지 데이터를 특정 이미지 형식으로 변환하는 것입니다. 인코딩된 이미지 데이터는 새로운 이미지 파일을 만드는 데 사용될 수 있습니다. WPF Imaging이 위에서 설명한 각 이미지 형식에 대한 인코더를 제공합니다.
다음 예제에서는 인코더를 사용하여 새로 만든 비트맵 이미지를 저장하는 방법을 보여 줍니다.
Dim stream As New FileStream("new.bmp", FileMode.Create)
Dim encoder As New BmpBitmapEncoder()
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString()
encoder.Frames.Add(BitmapFrame.Create(image))
encoder.Save(stream)
FileStream stream = new FileStream("new.bmp", FileMode.Create);
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
TextBlock myTextBlock = new TextBlock();
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);
WPF에서 이미지 표시
WPF(Windows Presentation Foundation) 응용 프로그램에서 이미지를 표시하는 방법에는 몇 가지가 있습니다. 이미지는 Image 컨트롤을 사용하여 표시하거나, ImageBrush를 사용하여 시각적 요소로 그리거나, ImageDrawing을 사용하여 그릴 수 있습니다.
이미지 컨트롤 사용
Image는 프레임워크 요소로, 응용 프로그램에서 이미지를 표시할 수 있는 기본적인 방법입니다. XAML에서 Image는 특성 구문과 속성 구문에서 사용될 수 있습니다. 다음 예제에서는 특성 구문과 속성 태그 구문을 모두 사용하여 200픽셀 너비의 이미지를 렌더링하는 방법을 보여 줍니다. 특성 구문 및 속성 구문에 대한 자세한 내용은 종속성 속성 개요를 참조하십시오.
<!-- Simple image rendering. However, rendering an image this way may not
result in the best use of application memory. See markup below which
creates the same end result but using less memory. -->
<Image Width="200"
Source="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"/>
<Image Width="200">
<Image.Source>
<!-- To save significant application memory, set the DecodePixelWidth or
DecodePixelHeight of the BitmapImage value of the image source to the desired
height and width of the rendered image. If you don't do this, the application will
cache the image as though it were rendered as its normal size rather then just
the size that is displayed. -->
<!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
or DecodePixelHeight but not both. -->
<BitmapImage DecodePixelWidth="200"
UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg" />
</Image.Source>
</Image>
많은 예제에서 BitmapImage 개체를 사용하여 이미지 파일을 참조합니다. BitmapImage는 XAML(Extensible Application Markup Language) 로딩을 위해 최적화된 특수화된 BitmapSource로, 이미지를 Image 컨트롤의 Source로 표시하는 간단한 방법입니다.
다음 예제에서는 코드를 사용하여 200픽셀 너비의 이미지를 렌더링하는 방법을 보여 줍니다.
참고
BitmapImage는 여러 속성에 대한 초기화를 최적화하기 위해 ISupportInitialize 인터페이스를 구현합니다. 속성 변경은 개체 초기화 중에만 수행할 수 있습니다. 초기화가 시작되었음을 신호로 보내려면 BeginInit를 호출하고, 초기화가 완료되었음을 신호로 보내려면 EndInit를 호출합니다. 초기화가 되고 나면 속성 변경이 무시됩니다.
' Create Image Element
Dim myImage As New Image()
myImage.Width = 200
' Create source
Dim myBitmapImage As New BitmapImage()
' BitmapImage.UriSource must be in a BeginInit/EndInit block
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg")
' To save significant application memory, set the DecodePixelWidth or
' DecodePixelHeight of the BitmapImage value of the image source to the desired
' height or width of the rendered image. If you don't do this, the application will
' cache the image as though it were rendered as its normal size rather then just
' the size that is displayed.
' Note: In order to preserve aspect ratio, set DecodePixelWidth
' or DecodePixelHeight but not both.
myBitmapImage.DecodePixelWidth = 200
myBitmapImage.EndInit()
'set image source
myImage.Source = myBitmapImage
// Create Image Element
Image myImage = new Image();
myImage.Width = 200;
// Create source
BitmapImage myBitmapImage = new BitmapImage();
// BitmapImage.UriSource must be in a BeginInit/EndInit block
myBitmapImage.BeginInit();
myBitmapImage.UriSource = new Uri(@"C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg");
// To save significant application memory, set the DecodePixelWidth or
// DecodePixelHeight of the BitmapImage value of the image source to the desired
// height or width of the rendered image. If you don't do this, the application will
// cache the image as though it were rendered as its normal size rather then just
// the size that is displayed.
// Note: In order to preserve aspect ratio, set DecodePixelWidth
// or DecodePixelHeight but not both.
myBitmapImage.DecodePixelWidth = 200;
myBitmapImage.EndInit();
//set image source
myImage.Source = myBitmapImage;
이미지의 회전, 변환 및 자르기
WPF에서는 사용자가 BitmapImage의 속성을 사용하거나 CroppedBitmap 또는 FormatConvertedBitmap와 같은 추가 BitmapSource 개체를 사용하여 이미지를 변환할 수 있습니다. 이러한 이미지 변환에는 이미지의 배율을 조정하거나 이미지를 회전하거나 이미지의 픽셀 형식을 변경하거나 이미지를 자르는 작업이 포함됩니다.
이미지 회전은 BitmapImage의 Rotation 속성을 사용하여 수행됩니다. 회전은 90도 단위로 증가하는 방식으로만 수행됩니다. 다음 예제에서 이미지는 90도 회전합니다.
<Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1">
<Image.Source>
<TransformedBitmap Source="/sampleImages/watermelon.jpg" >
<TransformedBitmap.Transform>
<RotateTransform Angle="90"/>
</TransformedBitmap.Transform>
</TransformedBitmap>
</Image.Source>
</Image>
<Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1">
<Image.Source>
<TransformedBitmap Source="/sampleImages/watermelon.jpg" >
<TransformedBitmap.Transform>
<RotateTransform Angle="90"/>
</TransformedBitmap.Transform>
</TransformedBitmap>
</Image.Source>
</Image>
' Create Image element.
Dim rotated90 As New Image()
rotated90.Width = 150
' Create the TransformedBitmap to use as the Image source.
Dim tb As New TransformedBitmap()
' Create the source to use as the tb source.
Dim bi As New BitmapImage()
bi.BeginInit()
bi.UriSource = New Uri("sampleImages/watermelon.jpg", UriKind.RelativeOrAbsolute)
bi.EndInit()
' Properties must be set between BeginInit and EndInit calls.
tb.BeginInit()
tb.Source = bi
' Set image rotation.
Dim transform As New RotateTransform(90)
tb.Transform = transform
tb.EndInit()
' Set the Image source.
rotated90.Source = tb
// Create Image element.
Image rotated90 = new Image();
rotated90.Width = 150;
// Create the TransformedBitmap to use as the Image source.
TransformedBitmap tb = new TransformedBitmap();
// Create the source to use as the tb source.
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(@"sampleImages/watermelon.jpg", UriKind.RelativeOrAbsolute);
bi.EndInit();
// Properties must be set between BeginInit and EndInit calls.
tb.BeginInit();
tb.Source = bi;
// Set image rotation.
RotateTransform transform = new RotateTransform(90);
tb.Transform = transform;
tb.EndInit();
// Set the Image source.
rotated90.Source = tb;
이미지를 회색조와 같은 다른 픽셀 형식으로 변환할 때는 FormatConvertedBitmap을 사용합니다. 다음 예제에서 이미지는 Gray4로 변환됩니다.
<!-- Grayscale XAML Image -->
<Image Width="200" Grid.Column="0" Grid.Row="1">
<Image.Source>
<FormatConvertedBitmap Source="/sampleImages/rocks.jpg" DestinationFormat="Gray4" />
</Image.Source>
</Image>
'Create Image Element
Dim grayImage As New Image()
grayImage.Width = 200
grayImage.Margin = New Thickness(5)
'Create source using xaml defined resource.
Dim fcb As New FormatConvertedBitmap(CType(Me.Resources("masterImage"), BitmapImage), PixelFormats.Gray4, Nothing, 0)
'set image source
grayImage.Source = fcb
//Create Image Element
Image grayImage = new Image();
grayImage.Width = 200;
grayImage.Margin = new Thickness(5);
//Create source using xaml defined resource.
FormatConvertedBitmap fcb = new FormatConvertedBitmap(
(BitmapImage)this.Resources["masterImage"],PixelFormats.Gray4,null,0);
//set image source
grayImage.Source = fcb;
이미지를 잘라내는 경우 Image의 Clip 속성 또는 CroppedBitmap을 사용할 수 있습니다. 일반적으로 이미지의 일부분만 표시하려는 경우에는 Clip을 사용해야 합니다. 잘라낸 이미지를 인코딩 및 저장해야 하는 경우 CroppedBitmap을 사용해야 합니다. 다음 예제에서는 EllipseGeometry를 사용하는 Clip 속성을 사용하여 이미지를 자릅니다.
<!-- Cropping an Image using Clip -->
<Image Width="200" Grid.Column="0" Grid.Row="5" Margin="5"
Source="/sampleImages/gecko.jpg">
<Image.Clip>
<EllipseGeometry Center="75,50" RadiusX="50" RadiusY="25" />
</Image.Clip>
</Image>
' Create the image for clipping
Dim clipImage As New Image()
clipImage.Width = 200
clipImage.Margin = New Thickness(5)
'Create & Set source
Dim bi As New BitmapImage()
' BitmapImage properties must be in a BeginInit/EndInit block
bi.BeginInit()
bi.UriSource = New Uri("pack://application:,,/sampleImages/gecko.jpg")
bi.EndInit()
clipImage.Source = bi
' Clip the using an EllipseGeometry
Dim clipGeometry As New EllipseGeometry(New System.Windows.Point(75, 50), 50, 25)
clipImage.Clip = clipGeometry
//Create the image for clipping
Image clipImage = new Image();
clipImage.Width = 200;
clipImage.Margin = new Thickness(5);
//Create & Set source
BitmapImage bi = new BitmapImage();
//BitmapImage.UriSource must be in a BeginInit/EndInit block
bi.BeginInit();
bi.UriSource = new Uri("pack://application:,,/sampleImages/gecko.jpg");
bi.EndInit();
clipImage.Source = bi;
//Clip the using an EllipseGeometry
EllipseGeometry clipGeometry = new EllipseGeometry(new Point(75, 50), 50, 25);
clipImage.Clip = clipGeometry;
이미지 늘이기
Stretch 속성은 해당 컨테이너를 채우도록 이미지를 늘이는 방법을 제어합니다. Stretch 속성은 Stretch 열거형으로 정의되는 다음과 같은 값을 사용합니다.
None: 이미지를 늘려 출력 영역을 채우지 않습니다. 이미지가 출력 영역보다 큰 경우 이미지를 출력 영역에 그리고 맞지 않는 부분은 잘라냅니다.
Fill: 출력 영역에 맞게 이미지 배율을 조정합니다. 이미지의 높이와 너비의 배율이 개별적으로 조정되기 때문에 이미지의 원래 가로 세로 비율이 유지되지 않을 수 있습니다. 즉, 출력 컨테이너를 완벽하게 채우기 위해 이미지가 휘어질 수 있습니다.
Uniform: 출력 영역 안에 이미지가 완전히 들어오도록 이미지 배율을 조정합니다. 이미지의 가로 세로 비율이 유지됩니다.
UniformToFill: 이미지의 원래 가로 세로 비율을 유지하면서 출력 영역을 완전하게 채우도록 이미지 배율을 조정합니다.
다음 예제에서는 사용 가능한 각각의 Stretch 열거형을 Image에 적용합니다.
다음 이미지에서는 예제의 출력을 보여 주고 다른 Stretch 설정을 이미지에 적용했을 때 미치는 영향을 보여 줍니다.
여러 가지 늘이기 설정
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Border DockPanel.Dock="Top" Background="Black">
<TextBlock Foreground="White" HorizontalAlignment="Stretch" FontSize="20">
Stretching an Image
</TextBlock>
</Border>
<Grid Name="simpleGrid" Background="{StaticResource CheckeredBrushResource}"
Margin="10"
ShowGridLines="True"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="175" />
<ColumnDefinition Width="175" />
<ColumnDefinition Width="175" />
<ColumnDefinition Width="175" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="200"/>
</Grid.RowDefinitions>
<!-- Labels -->
<TextBlock Style="{StaticResource Header1}"
Grid.Column="0" Grid.Row="0">None</TextBlock>
<TextBlock Style="{StaticResource Header1}"
Grid.Column="1" Grid.Row="0">Uniform</TextBlock>
<TextBlock Style="{StaticResource Header1}"
Grid.Column="2" Grid.Row="0">UniformToFill</TextBlock>
<TextBlock Style="{StaticResource Header1}"
Grid.Column="3" Grid.Row="0">Fill</TextBlock>
<Border Grid.Column="0" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
<!-- None: Image is not scaled. If image is larger than the
output area, the image will be cropped to the size of the output area.-->
<Image
Source="sampleImages/gecko.jpg"
Stretch="None" />
</Border>
<Border Grid.Column="1" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
<!-- Uniform: Scale to fit output area.
Aspect ratio is preserved.-->
<Image
Source="sampleImages/gecko.jpg"
Stretch="Uniform" />
</Border>
<Border Grid.Column="2" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
<!-- UniformToFill: Scale to completely fill output area.
Aspect ratio is preserved. Cropping may occur.-->
<Image
Source="sampleImages/gecko.jpg"
Stretch="UniformToFill" />
</Border>
<Border Grid.Column="3" Grid.Row="1" BorderThickness="1" BorderBrush="Black">
<!-- Fill: Scale to completely fill output area.
Aspect ratio may not be preserved.-->
<Image
Source="sampleImages/gecko.jpg"
Stretch="Fill" />
</Border>
</Grid>
</DockPanel>
</Page>
이미지 그리기
응용 프로그램에서 이미지는 Brush를 사용한 그리기로 표시될 수도 있습니다. 브러시를 사용하면 간단한 단색부터 복잡한 패턴 및 이미지 집합에 이르기까지 모든 것을 사용하여 UI 개체를 그릴 수 있습니다. 이미지를 그리려면 ImageBrush를 사용합니다. ImageBrush는 콘텐츠를 비트맵 이미지로 정의하는 TileBrush 형식입니다. ImageBrush는 해당 ImageSource 속성에 지정된 단일 이미지를 표시합니다. 이미지 왜곡을 방지하고 패턴 및 기타 효과를 만드는 동시에 이미지를 늘이고 정렬하고 바둑판식으로 배열하는 방법을 제어할 수 있습니다. 다음 그림에서는 ImageBrush로 얻을 수 있는 몇 가지 효과를 보여 줍니다.
이미지 브러시는 도형, 컨트롤, 텍스트 등을 채울 수 있음
다음 예제에서는 ImageBrush를 사용하여 이미지가 있는 단추의 배경을 그리는 방법을 보여 줍니다.
<!-- Sets the button's Background property with an ImageBrush. The resulting
button has an image as its background. -->
<Button Grid.Row="3" Grid.Column="2"
Height="75" Width="100" Foreground="White" FontWeight="Bold"
HorizontalAlignment="Left">
A Button
<Button.Background>
<ImageBrush ImageSource="sampleImages\blueberries.jpg" />
</Button.Background>
</Button>
ImageBrush 및 이미지 그리기에 대한 자세한 내용은 이미지, 그림 및 시각적 표시로 그리기를 참조하십시오.
이미지 메타데이터
일부 이미지 파일에는 해당 파일의 내용이나 특성을 설명하는 메타데이터가 있습니다. 예를 들어 대부분의 디지털 사진에 포함된 메타데이터를 분석하면 사진 촬영에 사용한 카메라의 제조업체와 모델을 알 수 있습니다. 각 이미지 형식은 메타데이터를 다르게 처리하지만 WPF Imaging에서는 지원되는 각 이미지 형식에 대한 메타데이터를 일관된 방식으로 저장하고 검색합니다.
메타데이터는 BitmapSource 개체의 Metadata 속성을 통해 액세스할 수 있습니다. Metadata는 이미지가 갖고 있는 모든 메타데이터를 포함하는 BitmapMetadata 개체를 반환합니다. 이 데이터는 하나의 메타데이터 스키마일 수도 있고 여러 스키마가 조합된 것일 수도 있습니다. WPF Imaging에서는 Exif(Exchangeable Image File), tEXt(PNG 텍스트 데이터), IFD(이미지 파일 디렉터리), IPTC(International Press Telecommunications Council) 및 XMP(Extensible Metadata Platform)과 같은 이미지 메타데이터 스키마를 지원합니다.
메타데이터를 읽는 과정을 단순화하기 위해 BitmapMetadata는 Author, Title 및 CameraModel과 같이 쉽게 액세스할 수 있는 몇 가지 명명된 속성을 제공합니다. 이러한 명명된 속성 중 많은 수가 메타데이터 작성에도 사용될 수 있습니다. 메타데이터 쿼리 판독기를 통해 메타데이터 읽기에 대한 추가 지원을 받을 수 있습니다. GetQuery 메서드는 *"/app1/exif/"*와 같은 문자열 쿼리를 제공하여 메타데이터 쿼리 판독기를 검색하는 데 사용됩니다. 다음 예제에서는 GetQuery를 사용하여 "/Text/Description" 위치에 저장된 텍스트를 구하는 방법을 보여 줍니다.
' Add the metadata of the bitmap image to the text block.
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "The Description metadata of this image is: " + pngInplace.GetQuery("/Text/Description").ToString()
// Add the metadata of the bitmap image to the text block.
TextBlock myTextBlock = new TextBlock();
myTextBlock.Text = "The Description metadata of this image is: " + pngInplace.GetQuery("/Text/Description").ToString();
메타데이터를 작성하기 위해서는 메타데이터 쿼리 작성기를 사용합니다. SetQuery는 쿼리 작성기를 구하고 원하는 값을 설정합니다. 다음 예제에서는 SetQuery를 사용하여 "/Text/Description" 위치에 저장된 텍스트를 작성하는 방법을 보여 줍니다.
Dim pngStream As New System.IO.FileStream("smiley.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
Dim pngDecoder As New PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim pngFrame As BitmapFrame = pngDecoder.Frames(0)
Dim pngInplace As InPlaceBitmapMetadataWriter = pngFrame.CreateInPlaceBitmapMetadataWriter()
If pngInplace.TrySave() = True Then
pngInplace.SetQuery("/Text/Description", "Have a nice day.")
End If
pngStream.Close()
Stream pngStream = new System.IO.FileStream("smiley.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
PngBitmapDecoder pngDecoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapFrame pngFrame = pngDecoder.Frames[0];
InPlaceBitmapMetadataWriter pngInplace = pngFrame.CreateInPlaceBitmapMetadataWriter();
if (pngInplace.TrySave() == true)
{ pngInplace.SetQuery("/Text/Description", "Have a nice day."); }
pngStream.Close();
코덱 확장성
WPF Imaging의 핵심 기능은 새로운 이미지 코덱에 대한 확장성 모델입니다. 이러한 관리되지 않는 인터페이스를 통해 코덱 개발자는 코덱과 WPF를 통합하므로 WPF 응용 프로그램에서 새로운 이미지 형식을 자동으로 사용할 수 있습니다. 관리되지 않는 WPF Imaging에 대한 자세한 내용은 Unmanaged WPF Imaging Component 설명서를 참조하십시오.
확장성 API 샘플은 Win32 샘플 코드을 참조하십시오. 이 샘플에서는 사용자 지정 이미지 형식을 위해 디코더와 인코더를 만드는 방법을 보여 줍니다.
참고
시스템이 코덱을 인식하려면 코덱에 디지털 서명이 필요합니다.