7

Assetsの画像からWriteableBitmapを作成できます。

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

ただし、Pictures DirectoryからWriteableBitmapを作成できません( WinRT XAML Toolkitを使用しています) 。

//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);

これは正しいです ?

4

3 に答える 3

6

これは完全な工夫ですが、うまくいくようです...

// 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);
于 2013-02-06T06:00:59.247 に答える
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);
   }
}

書き込み可能なビットマップが使用するピクセル形式とアルファモードを使用しており、合格していることに注意してください。

于 2013-02-06T07:22:23.300 に答える
3

WriteableBitmapFromBitmapImageExtension.FromBitmapImage()ロードに使用された元のURIとIIRCを使用して機能し、appxのsBitmapImageでのみ機能しBitmapImageます。あなたの場合、Picturesフォルダからのロードはストリームからのロードによってのみ実行できるため、URIさえありません。したがって、最も速いものから最も遅いものへのオプションは次のとおりです。

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

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

于 2013-02-06T02:10:49.340 に答える