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 ...
随机推荐
- Docker修改已有容器的端口映射
Docker修改已有容器的端口映射 背景 拉取了jenkins的镜像,启动容器的时候端口就映射了8080,但这个演示环境要用到jenkins node,其中默认的代理端口是50000.漏了,就想着能否 ...
- DBSCAN学习笔记
基本概念 核心点:若某个点的密度达到算法设定的阈值,即ε-邻域内点的数量(包括自己)不小于minPts,则该点为核心点. 边界点:在ε-邻域内点的数量小于minPts,但是落在核心点邻域内的点. 噪声 ...
- ASP.NET Core 系列总结
<ASP.NET Core> 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习.总结笔记,逐渐 ...
- springboot 多数据源 实例(sybase、mysql数据库)(上)
最近项目 需要用到 sybase(sql anywhere).mysql 数据库 两边数据交互 .由于之前对sybase 数据库一点不懂 踩了许多坑 特意记下: 连接 sybase 客户端需要用到 S ...
- TreeMap排序Comparator()重写
package map_;import java.util.Comparator;import java.util.TreeMap;/* * @author YAM */public class Tr ...
- HGAME2023_WP_WEEK2
Git Leakage Githack一波带走,下载得到flag v2board 搜索得知V2Board存在越权漏洞,随便注册个账号拿到authorization 访问/api/v1/admin/us ...
- TrueNAS安装 一个厉害的nas系统
转载: 戴俊财--个人学习网站 https://www.daijuncai.cn/?p=128
- 这些 JavaScript 笔试题你能答对几道?
收藏 javascript-questions 这个仓库很久了,趁着周末来锻炼下自己的 JS 基础水平 因为逐渐也在承担一些面试工作,顺便摘录一些个人觉得比较适合面试的题目和方向 事件流(捕获.冒泡) ...
- WebGPU 01之Hello Triangle
1. 引言 WebGPU是什么? WebGPU 到底是什么? - Orillusion的回答 - 知乎 WebGPU与WebGL的对比? WebGL 与 WebGPU 比对 前奏 - 四季留歌 - 博 ...
- 开源分布式任务调度系统就选:DolphinScheduler
分布式任务调度这个话题是每个后端开发和大数据开发都会接触的话题.因为应用场景的广泛,所以有很多开源项目专注于解决这类问题,比如我们熟知的xxl-job. 那么今天要给大家推荐的则是另一个更为强大的开源 ...