WPF图片的缩放节省内存
一、前言
正好项目用到要加载大量图片,虽然说可以使用WPF提供的自带的UI虚拟化功能,但是直接加载大量的图片到内存还是会
消耗很多的内存,而且WPF支持UI虚拟化的ListBox等容器的布局是VirtualizingStackPanel,这个对图片多样化的展示支持就
够呛了,这个布局的话可以自己重新写个虚拟布局管理器,这不是本节的内容,本节要讨论的在WPF下的图片缩略图的问题。
在网上一搜一大把都是Winform下的图片缩放,其实在WPF下实现图片的缩放也是非常简单的。
二、WPF实现缩略图
WPF下图片的处理也是非常到位的,有很多的图片相关的处理类,如图片的编码解码包括裁剪图片啥的,都有。
WPF图片的显示主要靠BitmapSource,这是个抽象类,有好几个实现类的。本文说的就是BitmapImage,从本地加载图片:
BitmapImage bit = new BitmapImage();
using (FileStream fs = new FileStream(@"D:\Pictures\back.jpg", FileMode.Open))
{
fs.Seek(0, SeekOrigin.Begin);
bit.BeginInit();
bit.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
bit.CacheOption = BitmapCacheOption.OnLoad;
bit.DecodePixelWidth = 300;//需要缩略图的解码宽度
bit.DecodePixelHeight = (int)(bit.DecodePixelWidth * 0.625);//缩略图的解码高度
bit.StreamSource = fs;
bit.EndInit();
} img1.Source = bit;
如上,便是生成缩略图的关键。可以自行对比缩略图和原始图占用内存的情况,甚至可以保存下来对比。
当然如果想要等比例的缩放图片,可以尝试BitmapDecoder提前获取原图片的宽高,然后进行等比例缩放:
{
var decoder = BitmapDecoder.Create(fs, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
var thumnail = decoder.Thumbnail;
var frame = decoder.Frames[0];
var raww = frame.Width;//原图的宽
var rawh = frame.Height;//原图的高
}
WPF图片的缩放节省内存的更多相关文章
- wpf图片定点缩放
去年犯小人,万事不顺,4月刚换工作,开始新工作 遇到一个小问题,需要读取图片,然后对图片进行定点缩放,很简答的逻辑,很简单的代码,但是,这尼玛我被wpf给坑了,这一坑就是三天 好了,很简单的一个UI ...
- 缩放图片,解决bitmap 内存溢出out of memory的问题
很多人在android开发中都遇到了生成bitmap时候内存溢出,也就是out of memory(OOM)的问题,网上对这样的问题的的解决说法不一.笔者作为一个初级开发者,在这里向大家提供一种比较实 ...
- WPF中的imagesource 和内存图片的处理
[转载]ImageSource的使用心得 很多时候,我们会使用图片来装饰UI,比如作为控件背景等. 而这些图片可以分为两种形式,即存在于本地文件系统中的图片和存在于内存中的图片 对于这两种形式的图片, ...
- WPF图片预览之移动、旋转、缩放
原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...
- 以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法
我们在加载图片时经常会遇到内存溢出的问题,图片太大,我们加载图片时,一般都是用的如下一般方法(加载本地图片): /** * 不作处理,去加载图片的方法,碰到比较大的图片会内存溢出 */ private ...
- android图片拖动缩放
这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助.android 大图片拖拽缩放 这篇就不做过多介绍了,直接上源码: public class ...
- Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
我们知道,我们编写的应用程序都是有一定内存限制的.程序占用了过高的内存就easy出现OOM(OutOfMemory)异常.因此在展示高分辨率图片的时候,最好先将图片进行压缩,压缩后的图片大小应该和用来 ...
- 节省内存的循环banner(一)
循环banner是指scrollview首尾相连,循环播放的效果,使用非常广泛.例如淘宝的广告栏等. 如果是简单的做法可以把所有要显示的图片全部放进一个数组里,创建相同个数的图片视图来显示图片.这样的 ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- Android 图片的缩放与旋转
本文实现Android中的图片的缩放效果 首先设计布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...
随机推荐
- 行为型模式 - 访问者模式Visitor
学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 行为型模式,我之所以把他放到第一个,是因为它号称是GoF中最难的一个. 模式的定义与特点 在访问者模式中(Visitor Pat ...
- linux 基础(7)账号和群组的管理
了解账号和群组的基本信息 账号使用 如何查看 linux 计算机上有哪些账号呢?账号的信息储存在/etc/passwd中,打开就可以看到: less /etc/passwd root:x:0:0:ro ...
- SpringCloud 消费请求Eureka调用服务提供者报错
SpringCloud 消费请求Eureka调用服务提供者报错 springCloud 2022.0.1 springboot 3.0.2 消费程序 通过eureka集群查询服务,根据eureka中注 ...
- 2021级《JAVA语言程序设计》上机考试试题8
专业教师功能页: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- NETAPP 设备 C模式开关机顺序
设备正常开关机顺序开机顺序: 1.开启所有磁盘柜的电源,大概20秒后再开启存储控制器: 2.开启接有FAS2750存储的以太网交换机或者光纤交换机: 3.开启有挂载FAS2750存储空间的服务器或者磁 ...
- 基于ChatGPT的API的C#接入研究
今年开年,最火的莫过于ChatGPT的相关讨论,这个提供了非常强大的AI处理,并且整个平台也提供了很多对应的API进行接入的处理,使得我们可以在各种程序上无缝接入AI的后端处理,从而实现智能AI的各种 ...
- Java开发环境配置(win7-64bit)
Java开发环境配置(win7-64bit) java Java开发环境配置(win7-64bit) Java开发环境配置(win7-64bit) 1.概述 2.文本用到的工具 3.环境变量配置 4. ...
- 大规模 IoT 边缘容器集群管理的几种架构-4-Kubeedge
前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s 大规模 IoT 边缘容器集群管理的几种架构-2-H ...
- 分享手机上一款超多功能的APP(含428个功能):宇宙工具箱
无意中在网上发现一款功能超多的安卓APP,作者宣称是三百多个功能,但是目前统计已经有四百多个,而且不包含网友分享的上千功能. 这款工具的名称叫:宇宙工具箱. 它的功能主要包含10个类别: 图片工具 日 ...
- odoo Web Controllers 学习总结
环境 odoo-14.0.post20221212.tar Web Controllers Controllers 控制器需要提供可扩展性,就像Model,但不能使用相同的机制,因为先决条件(已加载模 ...