2016-03-15 9 views
6

http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-saveのコードを使用してプログラムでイメージのサイズを変更しました。ただし、このプロジェクトではWindowsのアプリケーションで利用できないライブラリSystem.Drawingが使用されています。Windows 10でイメージをコピーおよびサイズ変更する方法UWP

私が代わりにWindows.UI.Xaml.Media.ImagingからBitmapImageクラスを使用して試してみましたが、System.Drawingで発見された機能を提供していないようだ...

は、誰もがに(縮小)画像サイズを変更することができるという任意の運を持っていましたウィンドウズ10?私のアプリケーションは、異なるフォーマット/サイズの複数のソースからの画像を処理することになります。実際に表示されている画像に合わせてアプリケーションサイズを調整するのではなく、実際の画像のサイズを変更して領域を節約しようとしています。

EDIT

私は上記のリンクからコードを修正し、私の特定のニーズのために働くハックを持っています。ここでは、次のとおりです。

public static BitmapImage ResizedImage(BitmapImage sourceImage, int maxWidth, int maxHeight) 
{ 
    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; 
} 

このように動作しているようですが、理想的ではなく、元のBitmapImageを修正するよりも、私が変更し、代わりに返すために、それの新しい/コピーを作成したいと思います。 screenshot of resized image

+0

ミスリーディングタイトル、OP。イメージのサイズを変更する方法があります。元のイメージのコピーを作成し、サイズを変更してから、コピーを返します。 –

+0

@BrianDriscoll編集前に質問を投稿しました。この編集で元の画像のサイズを変更するコードが追加されました。私は答えとしてそれを掲示していただろうが、それはまだ十分ではなかった。しかし、私は新しいタイトルが好きです。ありがとう。 –

+0

イメージの定数を作成できますか?または、プライベートプロパティは、イメージの元のコピーを参照し、同じ機能を使用することができますか? – aguertin

答えて

7

私はむしろ元を変更するよりも、元BitmapImageのコピーを返すようにしたいことがあります。ここでは

はアクションで、それのショットです。

BitmapImageを直接コピーする方法はありませんが、StorageFileを何度も再利用できます。

あなただけの、画像を選択し、それを表示し、一方、元の1の再サイズの画像を表示中にしたい場合は、このようなパラメータとしてStorageFileを渡すことができます。このシナリオでは

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; 
} 

ますただ、このタスクを呼び出すと、このような再サイズの画像を表示する必要があります。

smallImage.Source = await ResizedImage(file, 250, 250); 

あなたはsourceImageのようないくつかの理由(によるBitmapImageパラメータを保持したい場合は修正ビットマップことなく、直接ファイルからロードされない場合があります)、あなたはtこの新しい画像を別の画像に再サイズするには、最初にサイズ変更した画像をファイルとして保存してから、このファイルを開いて再度サイズを変更する必要があります。

+0

これは素晴らしいです、ありがとう、グレース。'BitmapImage'や' IRandomAccessStream'を 'WriteableBitmap'や' RenderTargetBitmap'に入れてbase64文字列にエンコードする方法はありますか?私は 'StorageFile'を直接行うことができますが、サイズ変更されたイメージは' StorageFile'ではないので、別のデータ型に戻してエンコーディングする必要があります。 –

+0

私は、全体のプロセスを 'BitmapImage'の代わりに' WriteableBitmap'を使うように変更して、base64にエンコーディングするのに必要な形式のイメージを持っていました。私はまだ元の寸法を得るために 'ResizedImage'関数内に' BitmapImage'を作成する必要がありますが、少なくともそれは働きます:) –

+0

@dubstylee、あなたは正しい方法でそれをやっています、 BitmapImage'を64base文字列に変換します。 'IRandomAccessStream'を' WriteableBitmap'にするには 'BitmapDecoder'を使うことができますが、これはすでに知っていると思います。 –

関連する問題