我是靠谱客的博主 懦弱饼干,最近开发中收集的这篇文章主要介绍超大图片的缩放算法(撑爆内存的那种),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近做图像处理时,在超大图的缩放上遇到了困难。阿里云OSS不支持20M以上图片的缩放。

用opencv在内存里缩放,30000x30000的png图片,占用3g+内存,有点无法接受。

于是自己调研相关算法。

以300x300的png为例,正常缩放时,是将其整个读进内存,生成300x300x4的矩阵,然后对矩阵进行缩放,再将缩放后的矩阵写成png。

png读取时,是一行一行读取的,写盘时,也是一行一行写的。这里用 双立方(三次)卷积插值 进行缩放,该算法用临近的16个点(4x4)进行采样。所以一边读,一边缩放,一边写,是可行的!

建立一个4行的缓冲区,每读一行,就放进缓冲区,若缓冲区中的4行可以用来缩放,就进行缩放,将缩放后的数据写进输出流,循环直到所有行读取完毕。

输入:直接复制JDK的PNGImageReader做修改,用1x1的尺寸生成Raster(不会使用这个对象中的缓冲区),修改将像素数据写入Raster的代码,让像素数据写入Resizer。

缩放Resizer:接受读图出来的像素数据,并用 双立方(三次)卷积插值 进行缩放。将缩放后的行,写入输出。

输出:直接复制JDK的PNGIMageWriter做修改,使其支持一行一行写入。

最后

以上就是懦弱饼干为你收集整理的超大图片的缩放算法(撑爆内存的那种)的全部内容,希望文章能够帮你解决超大图片的缩放算法(撑爆内存的那种)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部