2013-02-05 7 views
6

私はAssetsの画像からWriteableBitmapを作成できました。BitmapImageからWriteableBitmapを作成するには?

Uri imageUri1 = new Uri("ms-appx:///Assets/sample1.jpg"); 
WriteableBitmap writeableBmp = await new WriteableBitmap(1, 1).FromContent(imageUri1); 

しかし、私は(私はWinRT XAML Toolkitを使用しています)、画像ディレクトリーからWriteableBitmapを作成することはできません

//open image 
StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 
StorageFile file = await picturesFolder.GetFileAsync("sample2.jpg"); 
var stream = await file.OpenReadAsync(); 

//create bitmap 
BitmapImage bitmap2 = new BitmapImage(); 
bitmap2.SetSource(); 
bitmap2.SetSource(stream); 

//create WriteableBitmap, but cannot 
WriteableBitmap writeableBmp3 = 
    await WriteableBitmapFromBitmapImageExtension.FromBitmapImage(bitmap2); 

は、この正しいですか?

答えて

5

これは総工夫ですが、動作するようには思えない...

// load a jpeg, be sure to have the Pictures Library capability in your manifest 
var folder = KnownFolders.PicturesLibrary; 
var file = await folder.GetFileAsync("test.jpg"); 
var data = await FileIO.ReadBufferAsync(file); 

// create a stream from the file 
var ms = new InMemoryRandomAccessStream(); 
var dw = new Windows.Storage.Streams.DataWriter(ms); 
dw.WriteBuffer(data); 
await dw.StoreAsync(); 
ms.Seek(0); 

// find out how big the image is, don't need this if you already know 
var bm = new BitmapImage(); 
await bm.SetSourceAsync(ms); 

// create a writable bitmap of the right size 
var wb = new WriteableBitmap(bm.PixelWidth, bm.PixelHeight); 
ms.Seek(0); 

// load the writable bitpamp from the stream 
await wb.SetSourceAsync(ms); 
3

WriteableBitmapFromBitmapImageExtension.FromBitmapImage()は、BitmapImageとIIRCをロードするために使用された元のUriを使用して動作し、それはappxからBitmapImagesでのみ動作します。あなたのケースでは、最速のあなたのオプションは、最も遅いするだけなので(私が思うに)、ストリームからロードすることによって行うことができますPicturesフォルダからロードするので、でもウリありませんが、次のとおりです。WriteableBitmapとして

  1. オープン画像からあなたはそれを再開したりビットをコピーする必要はありません。
  2. 2つのコピーが必要な場合は、WriteableBitmapとして開き、同じサイズの新しいWriteableBitmapを作成し、ピクセルバッファをコピーします。
  3. 2つのコピーが必要な場合は、最初のビットマップを開くために使用されるパスを追跡し、元のファイルと同じファイルからロードして新しいWriteableBitmapを作成します。

圧縮画像を2回デコードするのを避けるので、オプション2はオプション3より高速かもしれないと思います。

+0

お返事ありがとうございますが、getableからwriteablebitmapとして画像を開く方法は?私は[this](http://stackoverflow.com/questions/4254225/opening-an-image-file-into-writablebitmap)が参考になると思いますが、書き込み可能ビットマップに直接ビットマップを渡すことはできません。 – a2hiro

+0

このリンクはSilverlight用ではありません。あなたはイメージのためにStorageFileを取得する必要があります。ファイルピッカーを使用してOpenReadAsyncを待ってから、1x1 WriteableBitmapを作成してSetSourceAsyncを待ちます。サンプル/拡張機能については、これを確認してください:http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/4d568d4e4c6a#WinRTXamlToolkit/Imaging/WriteableBitmapLoadExtensions.cs –

4

ここでフィリップが指摘したようWriteableBitmapに画像を読み込む方法が機能します:

StorageFile imageFile = ... 

WriteableBitmap writeableBitmap = null; 
using (IRandomAccessStream imageStream = await imageFile.OpenReadAsync()) 
{ 
    BitmapDecoder bitmapDecoder = await BitmapDecoder.CreateAsync(
     imageStream); 

    BitmapTransform dummyTransform = new BitmapTransform(); 
    PixelDataProvider pixelDataProvider = 
     await bitmapDecoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, 
     BitmapAlphaMode.Premultiplied, dummyTransform, 
     ExifOrientationMode.RespectExifOrientation, 
     ColorManagementMode.ColorManageToSRgb); 
    byte[] pixelData = pixelDataProvider.DetachPixelData(); 

    writeableBitmap = new WriteableBitmap(
     (int)bitmapDecoder.OrientedPixelWidth, 
     (int)bitmapDecoder.OrientedPixelHeight); 
    using (Stream pixelStream = writeableBitmap.PixelBuffer.AsStream()) 
    { 
     await pixelStream.WriteAsync(pixelData, 0, pixelData.Length); 
    } 
} 

注意をそのIピクセルフォーマットとアルファモードを使用して書き込み可能なビットマップを使用し、私は合格する。

関連する問題