关于WriteableBitmap(wp7中) (转)

1. WriteableBitmap.SetSource 和 WriteableBitmap.LoadJpeg是不同的。

 

 

[csharp] view plain copy print ?
  1. constint CANVAS_WIDTH = 480; 
  2.  
  3. BitmapImage bmp = new BitmapImage(); 
  4. bmp.SetSource(stream); //stream为原始图片数据,例如可以是从文件中读到的 
  5.  
  6. int w = CANVAS_WIDTH; 
  7. int h = CANVAS_WIDTH * bmp.PixelHeight / bmp.PixelWidth; 
  8. WriteableBitmap wbmp = new WriteableBitmap(w, h); 
  9. wbmp.SetSource(stream); 
  10. WriteableBitmap wbmp2 = new WriteableBitmap(w, h); 
  11. wbmp2.LoadJpeg(stream); 
                    
                    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的白色位图

 

[csharp] view plain copy print ?
  1. WriteableBitmap wbmp = new WriteableBitmap(1000, 5000); 
  2.  
  3. long tick1 = DateTime.Now.Ticks; 
  4.  
  5. WriteableBitmap wbmp2 = new WriteableBitmap(1, 1); 
  6. wbmp2.Pixels[0] = -1; 
  7. Image img2 = new Image() 
  8.     Source = wbmp2, 
  9.     Width = 1, 
  10.     Height = 1, 
  11.     Stretch = Stretch.None, 
  12.     HorizontalAlignment = System.Windows.HorizontalAlignment.Left, 
  13.     VerticalAlignment = System.Windows.VerticalAlignment.Top 
  14. }; 
  15.  
  16. ScaleTransform trans2 = new ScaleTransform() { CenterX = 0, CenterY = 0, ScaleX = 1000, ScaleY = 5000 }; 
  17.  
  18. wbmp.Render(img2, trans2); 
  19. wbmp.Invalidate(); 
            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格式,压缩过),消耗内存发生在中间过程,相当于位图展开了

转载于:https://www.cnblogs.com/Ewan1997/articles/2811848.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值