阅读:7039回复:11
Java applet实现图片的放缩问题
<P>现总结两种方法:</P>
<P>1.在画板(canvas)中显示图片,通过画板大小的控制来实现图片的放大缩小.</P> <P>2.直接利用算法来控制图片的放大缩小:</P> <P>(1)获取Image图片像素信息:<BR>标准的midp1.0没有提供获取图片像素信息的函数,对于NOKIA的机器,我们可以采用Nokia SDK提供的API获取像素信息。具体程序如下:<BR>g = image.getGraphics()<BR>DirectGraphics dg = DirectUtils.getDirectGraphics(g);<BR>dg.getPixels(short[] pixels, int offset, int scanlength, int x,int y, int width, int height, int format)<BR>参数介绍:<BR>short[] pixels: 用于接收像素信息的数组<BR>int offset:这篇文章中的用到的地方,添0就可以了<BR>int scanlength:添图片的宽度就行了<BR>int x:添0<BR>int y:添0<BR>int width:图片宽度<BR>int height:图片高度<BR>int format:444,表示图形格式,好像Nokia S40的机器都是采用444格式表示RGB颜色的。就是红,绿,蓝各用4位表示,至于可以表示透明色ARGB的4444格式,应该是机器硬件实现的。<BR>想具体了解Nokia SDK的信息,可以查看Nokia SDK的帮助文档。</P> <P>使用像素信息数组生成Image图片:<BR>image = Image.createImage(w, h);<BR>g = image.getGraphics()<BR>DirectGraphics dg = DirectUtils.getDirectGraphics(g);<BR>dg.drawPixels(short[] pixels,boolean transparency, int offset, int scanlength, int x, int y, int width,int height, int manipulation, int format)<BR>short[] pixels:像素信息数组<BR>boolean transparency:是否包含alpha位信息<BR>int offset:添 0<BR>int scanlength:添图片的宽度就行了<BR>int x:添 0<BR>int y:添 0<BR>int width:图片宽度<BR>int height:图片高度<BR>int manipulation:添 0<BR>int format:444</P> <P>下面开始介绍具体的算法,首先给出图像缩放的完整函数,然后对代码,分段进行解释<BR> /*********************************<BR> * @todo 图片放大缩小<BR> * @param srcImg 原始图片<BR> * @param desW 变化后图片的宽<BR> * @param desH 变化后图片的高<BR> * @return 处理后的图片<BR> *********************************/<BR> private Image ZoomImage(Image srcImg, int desW, int desH) {<BR> int srcW = srcImg.getWidth(); //原始图像宽<BR> int srcH = srcImg.getHeight(); //原始图像高</P> <P> short[] srcBuf = new short[srcW * srcH]; //原始图片像素信息缓存</P> <P> //srcBuf获取图片像素信息<BR> Image desImg = Image.createImage(srcW, srcH);<BR> if (srcImg.isMutable()) { /*如果是可变图像*/<BR> DirectUtils.getDirectGraphics(srcImg.getGraphics()).<BR> getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444);<BR> } else { /*如果是非可变图像*/<BR> desImg.getGraphics().drawImage(srcImg, 0, 0, 0);<BR> DirectUtils.getDirectGraphics(desImg.getGraphics()).<BR> getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444);<BR> }</P> <P> //计算插值表<BR> short[] tabY = new short[desH];<BR> short[] tabX = new short[desW];</P> <P> int sb = 0;<BR> int db = 0;<BR> int tems = 0;<BR> int temd = 0;<BR> int distance = srcH > desH ? srcH : desH;<BR> for (int i = 0; i <= distance; i++) { /*垂直方向*/<BR> tabY[db] = (short) sb;<BR> tems += srcH;<BR> temd += desH;<BR> if (tems > distance) {<BR> tems -= distance;<BR> sb++;<BR> }<BR> if (temd > distance) {<BR> temd -= distance;<BR> db++;<BR> }<BR> }</P> <P> sb = 0;<BR> db = 0;<BR> tems = 0;<BR> temd = 0;<BR> distance = srcW > desW ? srcW : desW;<BR> for (int i = 0; i <= distance; i++) { /*水平方向*/<BR> tabX[db] = (short) sb;<BR> tems += srcW;<BR> temd += desW;<BR> if (tems > distance) {<BR> tems -= distance;<BR> sb++;<BR> }<BR> if (temd > distance) {<BR> temd -= distance;<BR> db++;<BR> }<BR> }</P> <P> //生成放大缩小后图形像素buf<BR> short[] desBuf = new short[desW * desH];<BR> int dx = 0;<BR> int dy = 0;<BR> int sx = 0;<BR> int sy = 0;<BR> int oldy = -1;<BR> for (int i = 0; i < desH; i++) {<BR> if (oldy == tabY) {<BR> System.arraycopy(desBuf, dy - desW, desBuf, dy, desW);<BR> } else {<BR> dx = 0;<BR> for (int j = 0; j < desW; j++) {<BR> desBuf[dy + dx] = srcBuf[sy + tabX[j]];<BR> dx++;<BR> }<BR> sy += (tabY - oldy) * srcW;<BR> }<BR> oldy = tabY;<BR> dy += desW;<BR> }</P> <P> //生成图片<BR> desImg = Image.createImage(desW, desH);<BR> DirectUtils.getDirectGraphics(desImg.getGraphics()).<BR> drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444);<BR> return desImg;<BR> }</P> <P>另外还有其他算法,若需要可直接与我联系:E_gzfplease@sian.com</P> |
|
1楼#
发布于:2006-08-12 15:05
<img src="images/post/smile/dvbbs/em02.gif" />
|
|
2楼#
发布于:2006-10-19 20:27
<img src="images/post/smile/dvbbs/em05.gif" /><img src="images/post/smile/dvbbs/em05.gif" /><img src="images/post/smile/dvbbs/em05.gif" /><img src="images/post/smile/dvbbs/em05.gif" />
|
|
3楼#
发布于:2007-01-19 12:56
支持!!
|
|
4楼#
发布于:2007-07-21 15:54
<P><img src="images/post/smile/dvbbs/em02.gif" />了!!! <img src="images/post/smile/dvbbs/em01.gif" />你!!!</P> |
|
5楼#
发布于:2007-07-22 17:02
<P>大侠帮助</P>
<P>up</P> |
|
6楼#
发布于:2007-09-26 11:04
<img src="images/post/smile/dvbbs/em01.gif" />
|
|
7楼#
发布于:2008-03-24 13:40
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em03.gif" /><img src="images/post/smile/dvbbs/em04.gif" /><img src="images/post/smile/dvbbs/em05.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em07.gif" />
|
|
8楼#
发布于:2008-04-01 15:15
<img src="images/post/smile/dvbbs/em07.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em05.gif" />
|
|
9楼#
发布于:2008-04-01 15:17
<P>1月16日,Sun宣布已经与MySQL AB达成协议,以大约10亿美元收购MySQL AB,其中8亿美元现金收购MySQL AB的全部股权,另外的2亿美元作为期权。 </P>
<P>MySQL负责开发社区的副总裁 Kaj 在他的blog中分析了这单交易对于MySQL的用户、核心社区以及公司员工会带来哪些影响,还发表了他与MySQL的两位创始人Monty和David关于此事的交谈。 </P> <P>MySQL总部位于瑞典,在全球25个国家共有约400名员工。交易完成之后,MySQL首席执行官马顿·尼科斯(Marten Mickos)将加盟Sun管理层。Sun一直是开放源代码软件的坚定支持者,该公司希望通过这一模式从软件业务获得更多营收。在此之前,Sun一直为MySQL的竞争对手PostgreSQL销售支持服务。 </P> <P>对于Sun来说,收购MySQL有助于该公司更好地为开放源代码网络应用平台LAMP提供支持。LAMP是Linux操作系统、Apache网络服务器、MySQL数据库和PHP/Perl编程语言的首字母缩写。这一交易预计将于2008年第三季度或第四季度完成,如何获得足够的现金,对于Sun来说将是第一要务。Sun首席执行官乔纳森·舒瓦茨(Jonathan Schwartz)表示,在交易完成之前,该公司就将开始为MySQL客户提供支持服务。</P> |
|
上一页
下一页