文档章节

位图缩放的快速方法

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 849
阅读 1
收藏 0
 

在嵌入式系统中快速地进行屏幕拉伸,不能采用线性插值之类的算法,那样太慢。只能采用复制或抽取像素行的方式实现。

网上有介绍位图快速拉伸的算法,如下:http://www.abcdown.net/InfoView/Article_212765.html

  假设欲将长度为N1的像素列变成长度为N2的像素列,首先,设立两个指针,一个作为源指针,指向原来的像素列,读取源像素,另一个作为目的指针,指向变换后的像素列,写入读取到的像素。然后,以拉伸后像素列的长度为循环次数,循环N2次,每次循环中由源指针处COPY一个像素到目的指针处,然后目的指针加一,源指针根据每次循环的不同需要增加一定步长(放大时步长是零或一,缩小时步长大于等于一)。
  算法的框架解决了,但是中心内容仍没有解决:如何确定每次循环里源指针增加的步长?或者说,每次循环里如何更新源指针的位置?容易看出,通过浮点运算很容易解决这个问题:设立一个初值为零的浮点变量,每次循环中,把这个浮点变量加上N1/N2,并将其结果的整数部分作为源指针距离起始位置的偏移量;这样,经过N2次循环,浮点变量的值恰好达到N1,源指针也恰好“走”到原像素列的末尾。
  这个方法可行,但是太慢。如果能将浮点运算转化成整数运算就快多了。那么如何转化呢?我们可以设立一个值域为N1*N2的整数计数器,每次循环递增N1,并且规定,计数器每增加N2,源指针就前进一个像素。这样,经过N2次循环,计数器共增加了N1*N2,源指针则增加了N1个单元,恰好“走”完全程。实际编程中,我们是用一个值域为N2的整数计数器,超出值域部分取模处理。算法大致如下:

int m = 0, count = 0;

for (int n = 0; n < N2; n++)
    {
      dest_pixels[n] = src_pixels[m];
      count += N1;
      while (count >= N2)
      {
        count -= N2;
        m++;
        }
    }

上面已经说得比较明白了,不过对于愚钝的我来说,还是不容易理解。于是再分解如下:

用插值的思维来看,目的像素与源像素的关系其实如下:

dest_pixels[(n)=src_pixels(n*N1/N2) ,n=1,2,...,N2
由于只有整数点像素,其中的n*N1/N2要进行取整。
[n*N1/N2]就是n*N1除以N2得到的整数部分嘛,怎么用算法来求整数部分呢?

设p=[n*N1/N2]=n*N1-m*N2   (m为一整数,p<N2)

就用n*N1每次减一个N2,m增加1, 直到p<=0为止,得到的m值就是n*N1/N2的整数部分。

m=0;
c=n*N1;
while(c>0)
{
c-=N2;
m++;
}

这样最上面的源程序就容易明白了,里面的while循环其实就是用来求n*N1/N2的整数部分的。稍微不同的是,最上面的源程序中的count、m是从一开始就累减和累加的,不用每个n都重新求,精度会不会稍有些不同?

© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
Android学习笔记之Bitmap位图的缩放

位图的缩放也可以借助Matrix或者Canvas来实现。 通过postScale(0.5f, 0.3f)方法设置旋转角度,然后用createBitmap方法创建一个经过缩放处理的Bitmap对象,最后用drawBitmap方法绘制到屏幕上,...

迷途d书童
2012/03/05
9K
1
如何为你的Android应用缩放图片

很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件...

阿淘
2012/11/02
0
0
如何为你的Android应用缩放图片[原创翻译]

很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件...

迷途d书童
2012/02/22
0
3
Android图形处理之Bitmap

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现...

等待流星
2014/11/17
0
0
Android学习笔记进阶20之得到图片的缩略图

<1>简介 之前往往是通过Bitmap、Drawable和Canvas配合完成,需要写一系列繁杂的逻辑去缩小原有图片,从而得到缩略图。 现在我给大家介绍一种比较简单的方法:(网上有) 在Android 2.2版本中...

迷途d书童
2012/03/05
896
0

没有更多内容

加载失败,请刷新页面

加载更多

软件测试工具书籍与面试题汇总下载(持续更新)

简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md 的节选。 欢迎转载,转载请附带此简介,谢谢! 试题 软件测试综合面试题(高级测试)-试题.pdf 软件测试...

python测试开发人工智能安全
28分钟前
0
0
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决

有个项目使用的log4j进行日志记录的,同时也是用log4j中的数据库配置直接把相应级别的日志直接插入oracle。 在把项目部署的另一个内网环境时候,把项目的其他配置都改了,唯独log4j中的数据库...

哥本哈根的小哥
37分钟前
1
0
耗时 2 年,用 8.5 万块乐高积木最牛复刻 Apple Park

简评:国外大佬复刻 Apple Park,看了一下细节,确实厉害!只有你想不到,没有乐高拼不起来的,有没有乐高大神挑战一下? 苹果公园以各种各样的方式鼓舞人心,让人感兴趣。从建筑、可持续性和...

极光推送
39分钟前
1
0
记一次查找Hdfs磁盘占用空间比实际存储文件大4倍的原因

在一次主备namenode发生切换后,重启datanode节点,发现磁盘空间很大,想清理一下磁盘, 通过命令Hdfs dfs -du -h --max-depth=1 / 发现实际文件的大小只有8g,通过du -h --max-depth=1 /ha...

PageYi
今天
5
0
阿里云推荐引擎使用教程

产品概述: 推荐引擎(Recommendation Engine,以下简称RecEng,特指阿里云推荐引擎)是在阿里云计算环境下建立的一套推荐服务框架,目标是让广大中小互联网企业能够在这套框架上快速的搭建满...

mcy0425
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部