2016-11-11 1 views
0

나는 Direct2D 렌더 타겟으로 작업하고 있는데, 타입이 ID2D1Bitmap입니다. 이 비트 맵을 WPF 창에 표시해야하며이 비트 맵을 Image 컨트롤로 호스팅하려고합니다. 이를 위해 ID2D1Bitmap 객체를 System::Windows::Media::ImageSource 객체로 변환하거나 나중에로드 할 수있는 파일에 비트 맵을 저장하는 것이 해결책이 될 수 있습니다.ID2D1Bitmap을 ImageSource로 변환하는 방법

Direct2D API가 AFAIK 솔루션을 제공하지 않기 때문에 다른 접근 방식을 찾지 만 결과가 전혀 없습니다.

이렇게 할 방법이 있습니까?

+0

아마도 도움이 될 수 있습니다. [비트 맵을 ImageSource로 변환] (http://stackoverflow.com/questions/26260654/wpf-converting-bitmap-to-imagesource) – MSL

+0

이것을 보았습니까? https://github.com/Microsoft/WPFDXInterop 우리가 사용할 수있는 샘플 코드가 있습니까? –

+0

도와 주려고하는 사람들에게 왜 대답하지 않습니까? –

답변

0

WPF 및 UWP 앱에서 가장 잘 발견 한 솔루션은 SharpDX입니다. SharpDX website을 참조하십시오.

이전에 D2DWrappers를 사용하려고했지만 (see the Microsoft site) UWP 개발에서 SharpDX 코드를 사용하기가 더 쉬웠습니다. WPF도 C# 코드이기 때문에 똑같이 생각할 것입니다.

0

Direct2D 비트 맵은 하드웨어 장치에 의존하는 리소스이므로 일반적으로 시스템의 CPU 쪽에서 쉽게 액세스 할 수 없습니다. 따라서 ID2D1Bitmap의 픽셀을 얻는 것은 어렵습니다. 그런 식으로 사용되는 것은 아닙니다. Direct2D 비트 맵에서 raw 바이트를 가져 오는 메커니즘은 일반적으로 바이트 스트림에 액세스하기 위해 WIC 비트 맵을 생성하여이를 수행합니다. 이 방법으로 파일이나 바이트 배열에 쓸 수 있으며 C#에서 액세스 할 수있는 interop을 사용할 수 있습니다. 파일에 쓰고 WPF로 읽으려는 경우이 메커니즘이 작동합니다. 처리 중에 얼마 동안 IWICBitmapSource 개체에 비트 맵 데이터가 있고이를 캐시 할 수 있으면 작업이 쉬울 것입니다. System.Drawing.BitmapSystem.Windows.Media.ImageSource으로 변환하면 여기에 답합니다. Converting Bitmap to ImageSource (@MSL에게 감사의 말을 전합니다).

이 시점에서 사용 방법은 약간 명확하지 않습니다. 의도 한 사용에 대한 정보 또는 짧은 샘플이 실제로 여기에서 도움이 될 것입니다.

편집 1 : Save ID2D1Bitmap to file하고 파일에 ID2D1Bitmap를 저장 코드의 버전에 대한 의견 : 이 SO QN를 살펴 보자. 기본적으로 IWICBitmap으로 변환하여 파일에 기록합니다. 이 단계에서는 IWICBitmapIWICBitmapSource에서 상속되기 때문에 CopyPixels() 메서드를 사용하여 비트 맵 데이터를 바이트 배열로 덤프 할 수도 있습니다. 이제

당신이 System.Drawing.Bitmap을 받고, 파일에 저장하는 방식으로 진행하는 경우는 다음과 같이 간단하다 :

bitmap = new Bitmap("<YOUR_BITMAP_FILENAME>") 

그리고 당신은 WPF에서 사용하기 위해 BitmapImage로 변환 할 수 있습니다 :

using(MemoryStream memstream = new MemoryStream()) 
{ 
    bitmap.Save(memstream, ImageFormat.Bmp); 
    memstream.Position = 0; 
    BitmapImage bitmapImage = new BitmapImage(); 
    bitmapImage.BeginInit(); 
    bitmapImage.StreamSource = memstream; 
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
    bitmapImage.EndInit(); 
} 
+0

바이트 스트림에 액세스하기 위해 ID2D1Bitmap 소스에서 WIC 비트 맵을 어떻게 만들 수 있습니까? 또한 WIC 비트 맵 소스에서 Drawing.Bitmap을 얻을 수있는 방법을 설명하는 것이 유용 할 것입니다. – Nick

+0

편집을 보았지만 코드를 실행할 때 비트 맵을 그릴 때 D2DERR_WRONG_RESOURCE_DOMAIN 오류가 나타납니다. – Nick

+0

rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE를 사용해보십시오. rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE; – jester

관련 문제