2

winrt에 대해 WriteableBitmapEx를 다운로드했습니다 (8 메트로 승리). 확장 메서드가있는 DLL에 대한 참조를 추가하여 코드에서 사용했습니다. 모든 것이 잘 컴파일됩니다.C# 메트로 앱에서 WriteableBitmapEx가 작동하지 않습니다.

문제는 확장 메서드가 아무런 영향을 미치지 않는다는 것입니다.

WriteableBitmap wb = new WriteableBitmap((int)pictureSize.Width, (int)pictureSize.Height); 
wb.SetSource(fileStream); 
var newWB = wb.Flip(FlipMode.Vertical); 
ImageControl.Source = newWB;  
newWB.Invalidate(); 

이미지가 화면에 표시되지 않습니다 여기 내 코드의 일부입니다. 그러나 선과 같이 이미지에 무언가를 그리려고하면 이미지가 변경되지 않고 화면에 나타납니다.

감사합니다.

+0

어디에서 WinRT 버전의 라이브러리를 가져 왔습니까? 그녀의 –

+0

: http : //writeablebitmapex.codeplex.com/releases/view/39577 –

+0

나는 이것을 내일 볼 것이다. - 르네 Schulte (lib의 저자). BTW, WBX 질문에 대한 StackOverflow는 모니터링하지 않으며 CodePlex 사이트의 토론 만 모니터링합니다. –

답변

2

wb.Flip을 사용할 때 이미지가 완전히로드되지 않았을 것으로 생각됩니다. IIRC wb.SetSource는 비동기 적으로 실행됩니다.

FromContent라는 WriteableBitmapEx 라이브러리에서 사용할 수있는 다른 방법이 있습니다. 이를 통해 앱의 콘텐츠에서 이미지를로드 할 수 있으며 메소드는 백그라운드에서 모든 것을 처리합니다.

아래 스 니펫은 logo.png를로드하고 뒤집은 다음 이미지 컨트롤에 WriteableBitmap을 할당합니다. 당신이 스트림이 WriteableBitmap로 변환하는 방법을 보게 될 WriteableBitmapEx.FromContent 방법의 WinRT 버전의 소스 코드에 보면

var wb = await BitmapFactory.New(1, 1).FromContent(new Uri(BaseUri, @"///assets/logo.png")); 
wb = wb.Flip(WriteableBitmapExtensions.FlipMode.Vertical); 
Viewport.Source = wb; 

. WriteableBitmap로 모든 이미지 포맷 IRandomAccessStream를 디코딩하기 위해 아래의 조각을 사용하여

// Decode image format 
var decoder = await BitmapDecoder.CreateAsync(fileStream); 
var transform = new BitmapTransform(); 
var pixelData = await decoder.GetPixelDataAsync(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb); 

// Swap R and B channels since it's reversed 
var pixels = pixelData.DetachPixelData(); 
for (var i = 0; i < pixels.Length; i += 4) 
{ 
    var r = pixels[i]; 
    var b = pixels[i + 2]; 
    pixels[i] = b; 
    pixels[i + 2] = r; 
} 

// Copy pixels to WriteableBitmap 
var wb = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight); 
using (var bmpStream = wb.PixelBuffer.AsStream()) 
{ 
    bmpStream.Seek(0, SeekOrigin.Begin); 
    bmpStream.Write(pixels, 0, (int)bmpStream.Length); 
} 


// Your original code 
var newWB = wb.Flip(FlipMode.Vertical); 
ImageControl.Source = newWB; 

네, 하나는 ESP를 제외한 것보다 훨씬 더 많은 코드입니다. 이전에 Silverlight 또는 WPF에서이 작업을 수행 한 경우

+0

이 작동하고 이제 앱에서 사진을로드하는 방법을 배웠습니다. 그러나 남아있는 문제는 FileOpenPicker를 사용하여 IRandomAccessStream에로드 된 그림에 대해이 작업을 수행하는 방법입니다. –

+0

나는 대답을 편집했다. –

+0

또한이 메서드를 투명하게 처리하는 lib에 메서드를 추가했습니다. FromStream. WriteableBitmapEx의 새로운 최종 1.0 릴리스가 오늘 출시 될 예정입니다. 그래서 내일 lib를 다운로드하고 이것을 사용하십시오. –