2017-01-20 4 views
1

ユニバーサルWindowsプロジェクトでトランスペアレントなPNGイメージのサイズを変更したいが、透明性が失われる。 Stack Overflowのこの記事に似ています。 Why does resizing a png image lose transparency? Stack Overflowで私の質問に関連するすべての記事をチェックしましたが、どれも正しい答えがありません。 誰かが私にそれを理解するのを助けることができますか?透明性を失うことなく、UWPプロジェクトでPNGのサイズを変更しますか?

public static async Task<BitmapImage> ResizedImage(StorageFile ImageFile, int maxWidth, int maxHeight) 
{ 

    IRandomAccessStream inputstream = await ImageFile.OpenReadAsync(); 
    BitmapImage sourceImage = new BitmapImage(); 
    sourceImage.SetSource(inputstream); 
    var origHeight = sourceImage.PixelHeight; 
    var origWidth = sourceImage.PixelWidth; 
    var ratioX = maxWidth/(float)origWidth; 
    var ratioY = maxHeight/(float)origHeight; 
    var ratio = Math.Min(ratioX, ratioY); 
    var newHeight = (int)(origHeight * ratio); 
    var newWidth = (int)(origWidth * ratio); 

    sourceImage.DecodePixelWidth = newWidth; 
    sourceImage.DecodePixelHeight = newHeight; 

    return sourceImage; 

} 
+0

を失うことなく、それのサイズを変更するコードの一部ですか?ビットマップを表示するIm​​ageコントロールの幅と高さを簡単に設定できます。 'Stretch'プロパティを例えばに設定すると、ビットマップを適切にスケーリングします。 「統一」。 – Clemens

+0

@クレメンス:問題はイメージを表示するだけではありません。あなたが考えるようにそれは簡単ではありません。 –

+0

なぜ透明性が失われるのか分かりません。 BitmapImageは透明なPNGをサポートしており、DecodePixelWidthプロパティとDecodePixelHeightプロパティの設定だけが変更されません。あなたのコードをテストしたところ、私にとってはうまくいきました。つまり、ビットマップは透過的なままです。 – Clemens

答えて

0

ビットマップに変換しているため透明度が失われています。ビットマップは透過性をサポートしていません。透明性をサポートする形式を使用する必要があります。

はここでPNGを取ると、あなたがすべてで、ビットマップのサイズを変更したいと思うのはなぜ透明性

private async void MakeSmaller(StorageFile inputFile, StorageFile outputFile) 
{ 
    using (var inputStream = await inputFile.OpenAsync(FileAccessMode.Read)) 
    { 
     var decoder = await BitmapDecoder.CreateAsync(inputStream); 

     var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); 

     using (var outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, 
                  outputStream); 

      encoder.SetSoftwareBitmap(softwareBitmap); 
      encoder.BitmapTransform.ScaledWidth = 50; 
      encoder.BitmapTransform.ScaledHeight = 50; 
      encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant; 

      await encoder.FlushAsync(); 
     } 
    } 
} 
+0

こんにちはマット、ボタンのクリックイベントでコードをテストするにはどうすればいいですか?app.pngという名前のアプリストレージにあるPNG画像ですか? –

+0

"ビットマップに変換するので透明性が失われています"。 OPは実際にそれをどこで行っていますか?この質問のコードは、DecodePixelWidthとDecodePixelHeightを設定した後でも、透明度をサポートするBitmapImageの使用法を示しています。 – Clemens

関連する問題