gzfxxy
路人甲
路人甲
  • 注册日期2006-07-19
  • 发帖数11
  • QQ
  • 铜币137枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:6586回复:11

Java applet实现图片的放缩问题

楼主#
更多 发布于:2006-08-10 09:14
<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>
喜欢0 评分0
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2006-08-12 15:05
<img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
zhaopengfei1
路人甲
路人甲
  • 注册日期2006-10-18
  • 发帖数26
  • QQ
  • 铜币8枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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" />
举报 回复(0) 喜欢(0)     评分
crafts
路人甲
路人甲
  • 注册日期2007-01-06
  • 发帖数17
  • QQ
  • 铜币140枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2007-01-19 12:56
支持!!
举报 回复(0) 喜欢(0)     评分
happy3930
路人甲
路人甲
  • 注册日期2007-05-14
  • 发帖数5
  • QQ
  • 铜币119枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2007-07-21 15:54

<P><img src="images/post/smile/dvbbs/em02.gif" />了!!! <img src="images/post/smile/dvbbs/em01.gif" />你!!!</P>
举报 回复(0) 喜欢(0)     评分
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2007-07-22 17:02
<P>大侠帮助</P>
<P>up</P>
举报 回复(0) 喜欢(0)     评分
xmpx000
路人甲
路人甲
  • 注册日期2006-07-27
  • 发帖数54
  • QQ
  • 铜币153枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2007-09-26 11:04
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
huanghun
路人甲
路人甲
  • 注册日期2006-03-26
  • 发帖数43
  • QQ
  • 铜币271枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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" />
举报 回复(0) 喜欢(0)     评分
sukhoi
路人甲
路人甲
  • 注册日期2003-09-07
  • 发帖数55
  • QQ
  • 铜币230枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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" />
举报 回复(0) 喜欢(0)     评分
sukhoi
路人甲
路人甲
  • 注册日期2003-09-07
  • 发帖数55
  • QQ
  • 铜币230枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部