快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
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++; } }

很明显原始表格宽度srcW = 4;放大后的表格宽度desW = 6;所以distance = desW = 6

接下来进入for循环,我们一步步的演算其循环的过程

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

| i| tabX赋值操作| tems | temd| sb | db |

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

|0| tabX[0] = 0 | 4 | 6 | 0 | 0 |

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

|1| tabX[0] = 0 | 2 | 6 | 1 | 1 |

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

|2| tabX[0] = 1 | 6 | 6 | 1 | 2 |

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

|3| tabX[0] = 1 | 4 | 6 | 2 | 3 |

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

|4| tabX[0] = 2 | 2 | 6 | 3 | 4 |

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

|5| tabX[0] = 3 | 6 | 6 | 3 | 5 |

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

|6| tabX[0] = 3 | 4 | 6 | 4 | 6 |

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

有此得到放大后1*6的表格为下图所示。其中每一个单元格中的数字n表示这个单元格的内容,和原始表格中第n个单元格的内容一样。

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

| 0 | 1 | 1 | 2 | 3 | 3 |

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

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

时间:2011-08-11

例如,左图为原始表格,右图为放大的表格

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

| 红 | 绿 | 兰 | 紫 | | 红 | 绿 | 绿 | 兰 | 紫 | 紫 |

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

同样,垂直方向的插值表我们也可以用相同的方法获得。

有了2个插值表,下面就可以生成放大和缩小后的图像了。

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; }

desBuf是用来保存放大缩小后的图像数据。例如我们把一个4*4像素的图像A放大成6*6的图像B,据前面的介绍我们可以生成2个插值表。tabX = {0,1,1,2,3,3},tabY = {0,1,1,2,3,3}。

在循环中会判断是否oldy 等于 tabY[i],这个操作等同于tabY[i-1]是否等于tabY[i]。如果等于,表示图像B前一行已经生成的数据和即将要生成的第i行数据相同,则只要执行System.arraycopy(desBuf, dy - desW, desBuf, dy, desW)把上一行的数据复制过来即可;如果不等,则需要对照水平插值表tabX生成这一行的数据。

算法演示过程如下:

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

| i|oldy|tabY[i]|运算情况|

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

|0|-1 | 0 | 情况2 |

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

|1| 0 | 1 | 情况2 |

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

|2| 1 | 1 | 情况1 |

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

|3| 1 | 2 | 情况2 |

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

|4| 2 | 3 | 情况2 |

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

|5| 3 | 3 | 情况1 |

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

然后我们用desBuf生成最终放大或缩小后的图片

desImg = Image.createImage(desW, desH); DirectUtils.get

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号