超大图片的缩放算法(撑爆内存的那种)

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

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

于是自己调研相关算法。

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值