快速业务通道

J2ME插值算法实现图片的放大缩小 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
uf, 0, srcW, 0, 0, srcW, srcH, 444); } //计算插值表 short[] tabY = new short[desH]; short[] tabX = new short[desW]; int sb = 0; int db = 0; int tems = 0; int temd = 0; int distance = srcH > desH ? srcH : desH; for (int i = 0; i <= distance; i++) { /*垂直方向*/ tabY[db] = (short) sb; tems += srcH; temd += desH; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } } sb = 0; db = 0; tems = 0; temd = 0; distance = srcW > desW ? srcW : desW; for (int i = 0; i <= distance; i++) { /*水平方向*/ tabX[db] = (short) sb; tems += srcW; temd += desW; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } } //生成放大缩小后图形像素buf short[] desBuf = new short[desW * desH]; int dx = 0; int dy = 0; int sx = 0; int sy = 0; int oldy = -1; for (int i = 0; i < desH; i++) { if (oldy == tabY[i]) { System.arraycopy(desBuf, dy - desW, desBuf, dy, desW); } else { dx = 0; for (int j = 0; j < desW; j++) { desBuf[dy + dx] = srcBuf[sy + tabX[j]]; dx++; } sy += (tabY[i] - oldy) * srcW; } oldy = tabY[i]; dy += desW; } //生成图片 desImg = Image.createImage(desW, desH); DirectUtils.getDirectGraphics(desImg.getGraphics()). drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444); return desImg; }

J2ME插值算法实现图片的放大缩小(3)

时间:2011-08-11

首先看函数的头两句,很容易,就是获取原始图片的宽度和高度

int srcW = srcImg.getWidth(); //原始图像宽

int srcH = srcImg.getHeight(); //原始图像高

接下来一句我们要定义一个short型数组,作为获取原始图片像素信息的缓存

short[] srcBuf = new short[srcW * srcH];

再下来一段,有的朋友可能会有些不明白,这里要解释一下。由于getPixels()这个函数,只能获取可变图像的像素信息,非可变图像,无法获取像素信息。所以我们要用srcImg.isMutable() 来判断,原始图像是不是可变图像,然后分两种情况来处理。如果srcImg是可变图像,我们就直接用getPixels()来获取它的像素信息,并保存在srcBuf里。如果srcImg不是可变图像,我们就需要把srcImage画到事先生成的可变图像desImg上,然后再获取desImg的像素信息。

Image desImg = Image.createImage(srcW, srcH); if (srcImg.isMutable()) { /*如果是可变图像*/ DirectUtils.getDirectGraphics(srcImg.getGraphics()). getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); } else { /*如果是非可变图像*/ desImg.getGraphics().drawImage(srcImg, 0, 0, 0); DirectUtils.getDirectGraphics(desImg.getGraphics()). getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); }

再往下就是缩放算法的重点:插值表的生成。插值表分水平差值表和垂直插值表,我们要分别生成原始图像矩阵的2种插值表,然后利用插值表生成放大缩小后的图像矩阵。由于这个内容比较抽象,很难用文字表述清楚,所以我们用实例进行介绍。

大家看下面这个水平的1*4的表格

-----------------

| 0 | 1 | 2 | 3 |

-----------------

J2ME插值算法实现图片的放大缩小(4)

时间:2011-08-11

如果要将这个表格放大成1*6的表格,放大的表格比原始表格多出了2个格子,我们只能对这多出来的2个格子进行插值,才能完成放大的操作。现在结合生成水平插值表的代码来完成这个过程。

distance = srcW > desW ? srcW : desW; for (int

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号