2013-06-14 1 views
6

Windows에서 이미지 데이터 버퍼를 Windows 런타임 구성 요소로 전달하는 효율적인 방법을 찾으려고합니다 8 버퍼 데이터가 필요한 횟수를 최소화합니다. 복사 할 수 있습니다.Windows Phone 8에서 이미지 데이터 버퍼를 Windows 런타임에 전달

Passing images from Windows (Phone) Runtime Components (c++/cx) to Native c++ Algorithms

배경

주제에 대한 MSDN 문서를 찾을 수 here를 참조하십시오 전에 유사하지만 좀 더 일반적인 질문은 질문하고있다. 기본 픽셀 버퍼를 IBuffer 개체로 노출 할 수있는 WriteableBitmap을 사용하면 기본 구성 요소가 버퍼를 먼저 복사하지 않고 현재 위치에서 데이터를 조작 할 수 있습니다.

만 윈도우 8이 대신 하나, System.Windows.Media.Imaging.WriteableBitmap를 사용할 수있는 윈도우 폰 8을 사용할 수 그러나 How to get access to WriteableBitmap.PixelBuffer pixels with C++?

WriteableBitmap가의 일부입니다 Windows.UI.Xaml.Media.Imaging 네임 스페이스되지 볼 수 있지만 그것은 단지에서 이미지 픽셀 데이터에 대한 액세스를 제공합니다 int []의 형식. 이를 IBuffer으로 변환하는 한 가지 방법은 다음과 같습니다.

using System.Windows.Media.Imaging; 
using System.Runtime.InteropServices.WindowsRuntime; 

private static IBuffer AsBuffer(WriteableBitmap bitmap) 
{ 
    int[] p = bitmap.Pixels; 
    int len = p.Length * 4; 
    byte[] arr = new byte[len]; 
    Buffer.BlockCopy(p, 0, arr, 0, len); 
    return arr.AsBuffer(); // Part of System.Runtime.InteropServices.WindowsRuntime 
} 

그러나 불필요한 버퍼 복사가 필요합니다.

반면에 데이터 전달 바이트 배열은 MSDN article에 따라 단점이 있습니다. 기본적으로 Windows 런타임에서 매개 변수는 입력 또는 출력 중 하나이며 둘 다 결코 아닙니다. 결국 일부 복사가 필요함을 의미합니다.

구함 대답

  • 어떻게 효율적으로 Windows 런타임 계층을 통해 이미지 데이터를 전달합니까?
  • 이미지를 전달할 때와 비디오 스트림을 전달할 때 적합한 RT 클래스는 무엇입니까? 간단한 배열 또는 복잡한 버퍼? 네이티브 코드에 대한
+0

해결하셨습니까? – tfzxyinhao

+0

Windows Phone 8.1에서 'Windows.UI.Xaml.Media.Imaging.WriteableBitmap'을 사용할 수 있습니다. – gannaway

답변

0

카메라 API는 길을 가야하는 것입니다 : http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj571202

당신이 당신의 C++ WinRT 구성 요소 코드에서 직접 데이터를 얻을 수 있습니다. 여기 예를 참조하십시오 http://library.developer.nokia.com/Community/Wiki/Getting_started_with_the_Camera_APIs_for_native_code

+0

제안 사항은 사진이나 기타 저장된 이미지가 아닌 새로운 이미지를 캡처 할 때만 작동합니다. – Tomas

+0

당신이 이것을위한 해결책을 찾을 수 있는지 궁금합니다. 나는 네이티브 구성 요소의 버퍼에 할당 된 바이트 []를 가지고 있으므로 네이티브로 처리됩니다. 이제는 WriteableBitmap에 바인드하는 방법을 고민하고 있습니다. int []에 모든 바이트를 비슷하게 복사하면 성능 저하가 발생할 수 있습니다. 그리고 .net에서 reinterpret_cast가 없다고 생각합니다. – bahti

0

당신이 사용할 수있는 IRandomAccessStream (또는 구상 클래스 InMemoryRandomAccessStream의) WinRT 구성 요소 사이의 원시 데이터를 교환 할 수 있습니다. 성취하고자하는 바에 따라 복사를 피하는 것이 좋습니다.