2013-02-05 23 views
6

मैं संपत्तियों में चित्रों से लिखित योग्य बिटमैप बना सकता हूं।बिटमैप इमेज से लिखित योग्य बिटमैप कैसे बनाएं?

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

लेकिन, मुझे नहीं 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); 

यह सही है? मूल उरी का उपयोग करके

उत्तर

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 केवल appx से BitmapImage के साथ काम करता है। आपके मामले में वहाँ भी एक उरी चित्र फ़ोल्डर से लोड हो रहा है केवल (मुझे लगता है कि), धारा से लोड करके किया जा सकता है तो सबसे तेजी से अपने विकल्पों को धीमी करने के बाद से नहीं है कर रहे हैं: से WriteableBitmap रूप

छवि
  1. ओपन जाओ, ताकि आपको इसे फिर से खोलने या बिट्स की प्रतिलिपि बनाने की आवश्यकता न हो।
  2. आप दो प्रतियां की आवश्यकता है - WriteableBitmap के रूप में यह खोलें और फिर एक ही आकार के एक नए WriteableBitmap बना सकते हैं और पिक्सेल बफर कॉपी।
  3. यदि आपको दो प्रतियां रखने की आवश्यकता है - पहले बिटमैप को खोलने के लिए उपयोग किए गए पथ को ट्रैक करें और फिर इसे एक ही फ़ाइल से मूल फ़ाइल के रूप में लोड करके नया WriteableBitmap बनाएं।

मुझे लगता है कि विकल्प 2 विकल्प 3 से तेज़ हो सकता है क्योंकि आप दो बार संपीड़ित छवि को डीकोड करने से बचते हैं।

+0

उत्तर देने के लिए धन्यवाद, लेकिन पाने के लिए लिखने योग्यता के रूप में छवि को कैसे खोलें ,? मुझे लगता है [यह] (http://stackoverflow.com/questions/4254225/opening-an-image-file-into-writablebitmap) सहायक हो सकता है, लेकिन मैं सीधे एक writablebitmap में बिटमैप पास नहीं कर सकता। – a2hiro

+0

कोई लिंक सिल्वरलाइट के लिए नहीं है। आपको अपनी छवि के लिए स्टोरेजफ़ाइल प्राप्त करने की आवश्यकता है उदा। फ़ाइल पिकर का उपयोग करके, फिर 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); 
    } 
} 

ध्यान दें कि मैं पिक्सेल प्रारूप और अल्फा मोड का उपयोग कर रहा हूँ लिखने योग्य बिटमैप उपयोग करता है और मैं पास करता हूं।

संबंधित मुद्दे