2

"색상 유형"으로 팔레트를 사용하는 PNG 렌더링에 문제가 있습니다. 다음은 문제를 재현 할 수있는 간단한 코드입니다.WriteableBitmap이 PNG를 잘못 렌더링합니다.

private async System.Threading.Tasks.Task Fetch() 
{ 
    HttpClient httpClient = new HttpClient(); 
    Uri uri = new Uri("http://static.splashnology.com/articles/How-to-Optimize-PNG-and-JPEG-without-Quality-Loss/PNG-Palette.png"); 
    HttpResponseMessage response = await httpClient.GetAsync(uri); 
    if (response.StatusCode == HttpStatusCode.Ok) 
    { 
     try 
     { 
      var content = await response.Content.ReadAsBufferAsync(); 
      WriteableBitmap image = await BitmapFactory.New(1, 1).FromStream(content.AsStream()); 
      Rect destination = new Rect(0, 0, image.PixelWidth, image.PixelHeight); 
      Rect source = new Rect(0, 0, image.PixelWidth, image.PixelHeight); 
      WriteableBitmap canvas = new WriteableBitmap(image.PixelWidth, image.PixelHeight); 
      canvas.Blit(destination, image, source); 
      RadarImage.Source = canvas; 
     } 
     catch (Exception e) 
     { 
      System.Diagnostics.Debug.WriteLine(e.Message); 
      System.Diagnostics.Debug.WriteLine(e.StackTrace); 
     } 
    } 
} 

Windows Phone 8.1을 사용하여 해당 코드를 실행하면 이미지에 잘못된 색상이 사용됩니다. RGB를 "Color Type"으로 사용하는 PNG를 사용하여 동일한 테스트를 수행하면 모든 것이 정상적으로 작동합니다.

나는 Codeplex 포럼을 살펴본 결과 관련 게시물을 보지 못했습니다. 내가 그것을 렌더링하는 방식과 관련이있을지라도 문제로보고했다. 잘못된 렌더링을 일으킬 수있는 WriteableBitmap을 사용하는 방식에 실수가 있습니까?


UPDATE

이 논의 https://writeablebitmapex.codeplex.com/discussions/274445 에 따르면, 문제는 바이트의 예상치 못한 순서와 관련이 있습니다. 이 의견은 1 년 반 전의 것이므로 어딘가에 적절한 수정이 있어야한다고 생각합니다.

잘못 렌더링 된 이미지는 위의 코드에 있습니다.

이 코드는 동일한 코드를 사용하여 올바르게 렌더링됩니다. http://www.queness.com/resources/images/png/apple_ex.png

두 이미지의 유일한 차이점은 "색상 유형"속성입니다. 실패한 것은 "Palette"로 설정되고 올바르게 렌더링 된 것은 "RGB Alpha"로 설정됩니다.

감사합니다. 카를로스.

+0

: 당신은 당신이 그것으로 디코딩 할 형식을 지정할 수 있도록

당신은 FromStream를 생략하고 BitmapDecoder를 사용하여이 문제를 우회 할 수있다. com/discussions/274445 –

+0

WriteableBitmapExtensions.BlendMode.None을 전달하고 정렬하는지 확인해보십시오. 기본값은 다를 수 있습니다. –

+0

사용한 두 이미지를 게시 할 수 있습니까? –

답변

1

이 문제는 팔레트가있는 png를 RGBA로 변환하는 것으로 보이는 FromStream 확장에있는 것으로 보입니다. 참고로 WriteableBitmap은 BGRA를 원합니다. FromStream이 팔레트가 아닌 PNG 픽셀을 unswizzled로 전달합니다. 이렇게하면 사과가 시작되어 BGRA로 끝나고 원숭이는 RGBA로 끝나고 빨간색과 파란색이 뒤집혀 그립니다. //writeablebitmapex.codeplex : HTTPS - 당신이 코드 플렉스는 당신이 본 언급

// Read the retrieved image's bytes and write them into an IRandomAccessStream 
IBuffer buffer = await response.Content.ReadAsBufferAsync(); 
var randomAccessStream = new InMemoryRandomAccessStream(); 
await randomAccessStream.WriteAsync(buffer); 

// Decode the downloaded image as Bgra8 with premultiplied alpha 
// GetPixelDataAsync lets us pass in the desired format and it'll do the magic to translate as it decodes 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream); 
var pixelData = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, new BitmapTransform(), ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); 

// Get the decoded bytes 
byte[] imageData = pixelData.DetachPixelData(); 

// And stick them in a WriteableBitmap 
WriteableBitmap image = new WriteableBitmap((int)decoder.PixelWidth,(int) decoder.PixelHeight); 
Stream pixelStream = image.PixelBuffer.AsStream(); 

pixelStream.Seek(0, SeekOrigin.Begin); 
pixelStream.Write(imageData, 0, imageData.Length); 

// And stick it in an Image so we can see it. 
RadarImage.Source = image; 
+0

그 대답입니다! 나는 나 자신을 알아 내지 못했을 것이다. 감사! – user1611363

+0

당신은 내가이 버그에 얼마나 많은 시간을 할애했는지 상상조차하지 못합니다. 방금 날 구 했어요! – Dean