天天看點

關于WriteableBitmap(wp7中)

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格式,壓縮過),消耗記憶體發生在中間過程,相當于位圖展開了