2013-02-05 1 views
6

애셋의 사진에서 WriteableBitmap을 만들 수 있습니다. (나는 WinRT XAML Toolkit을 사용하고 있습니다)BitmapImage에서 WriteableBitmap을 만드는 방법은 무엇입니까?

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

하지만, 나는

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

이 정확, 그림 Directory에서 WriteableBitmap을 만들 수없는 이유는 무엇입니까?

답변

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()은 원래을로드하는 데 사용 된 Uri를 사용하며, IIRC는 앱에서 BitmapImage과 작동합니다. 귀하의 경우에는 가장 빠른에서 옵션이 느린 할 수 있도록 전용 (내 생각), 스트림에서로드하여 수행 할 수 있습니다 사진 폴더에서로드하기 때문에 심지어 열린 우리당이 아니다는 다음과 같습니다 WriteableBitmap

  1. 열기 이미지에서 이동하여 다시 열거 나 비트를 복사 할 필요가 없습니다.
  2. 두 개의 복사본이 필요한 경우 - WriteableBitmap으로 연 다음 동일한 크기의 새 WriteableBitmap을 만들고 픽셀 버퍼를 복사하십시오.
  3. 두 개의 복사본이 필요한 경우 - 첫 번째 비트 맵을 여는 데 사용 된 경로를 추적 한 다음 원본 파일과 동일한 파일에서로드하여 새 WriteableBitmap을 새로 만듭니다.

압축 된 이미지를 두 번 디코딩하지 않으므로 옵션 2가 옵션 3보다 빠르다 고 생각합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 getable에서 writeablebitmap으로 이미지를 여는 방법은 무엇입니까? 내가 생각하는 [this] (http://stackoverflow.com/questions/4254225/opening-an-image-file-into-writablebitmap) 도움이 될 수 있지만 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 픽셀 형식 및 알파 모드 쓰기 가능 비트 맵을 사용하고 있으며이를 사용하고 있습니다.

관련 문제