1. WriteableBitmap.SetSource 和 WriteableBitmap.LoadJpeg是不同的。
const int CANVAS_WIDTH = 480;
BitmapImage bmp = new BitmapImage();
bmp.SetSource(stream); //stream為原始圖檔資料,例如可以是從檔案中讀到的
int w = CANVAS_WIDTH;
int h = CANVAS_WIDTH * bmp.PixelHeight / bmp.PixelWidth;
WriteableBitmap wbmp = new WriteableBitmap(w, h);
wbmp.SetSource(stream);
WriteableBitmap wbmp2 = new WriteableBitmap(w, h);
wbmp2.LoadJpeg(stream);
執行完上述代碼,wbmp的寬高為圖檔原始寬高,而wbmp2的寬高為修改過的寬高,即寬度限定為480像素了。簡單來說,如果希望圖檔按指定的寬高載入,用LoadJpeg;希望保持原始寬高,用SetSource
2.
WriteableBitmap.Render(UIElement element, Transform transform) 可以将一個控件截圖到WriteableBitmap中,但是注意,在這個函數之後調用WriteableBitmap.Invalidate() 才能正式生效。
構造函數WriteableBitmap(UIElement element, Transform transform)和Render作用類,但Render更靈活,可以在現有圖上面繼續疊加控件的截圖
示例,生成一個1000*5000的白色位圖
WriteableBitmap wbmp = new WriteableBitmap(1000, 5000);
long tick1 = DateTime.Now.Ticks;
WriteableBitmap wbmp2 = new WriteableBitmap(1, 1);
wbmp2.Pixels[0] = -1;
Image img2 = new Image()
{
Source = wbmp2,
Width = 1,
Height = 1,
Stretch = Stretch.None,
HorizontalAlignment = System.Windows.HorizontalAlignment.Left,
VerticalAlignment = System.Windows.VerticalAlignment.Top
};
ScaleTransform trans2 = new ScaleTransform() { CenterX = 0, CenterY = 0, ScaleX = 1000, ScaleY = 5000 };
wbmp.Render(img2, trans2);
wbmp.Invalidate();
3. 記憶體
WriteableBitmap需要占=記憶體 寬*高*4
需要注意的是:在調用函數void SaveJpeg(this WriteableBitmap bitmap, Stream targetStream, int targetWidth, int targetHeight, int orientation, int quality)時,有一個瞬時需要額外占用記憶體 targetWidth*targetHeight*4.
如果圖檔很大而且記憶體已經很緊張了,這個時候可能導緻記憶體溢出崩潰
注:這裡将圖檔儲存在MemeoryStream裡和IsolatedStorageFileStream裡差别不大。因為儲存圖檔本身需要的控件不大(jpg格式,壓縮過),消耗記憶體發生在中間過程,相當于位圖展開了