`
pandonix
  • 浏览: 399585 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解决MiroEmulator中加载图片的Bug

阅读更多
解决MiroEmulator中加载图片的Bug

作者:pandonix

日期:200798

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

原文地址:http://pandonix.iteye.com

前段时间一直在研究MiroEmulator(以下简称ME),这一个纯Java实现的J2me模拟器,支持AppletSwt以及Swing多个版本的模拟器。关于ME的介绍,请参考CleverPigMiroEmulator使用入门中文版:

http://www2.matrix.org.cn/resource/MicroEmulator_reference/MicroEmulator_applet_CN.html

ME下载地址:

http://www.microemu.org/

目前的最新版本为2.0.1

总的说来,ME已经实现了J2me大部分的类库,包括诸如NokiaUI等扩展包都已经实现。但是,遗憾的是,我在使用其运行第一个游戏就出现了问题,汗一个-_-

出现问题的大致情况为,启动游戏后,某张PNG图片没有加载成功,在屏幕中没有显示出来。

重新编译ME的源码,并启动游戏以后,发现抛出了如下的异常信息:

java.util.zip.ZipException: unknown compression method    at java.util.zip.InflaterInputStream.read(Unknown Source)    at java.io.BufferedInputStream.fill(Unknown Source)    at java.io.BufferedInputStream.read(Unknown Source)    at sun.awt.image.PNGImageDecoder.produceImage(Unknown Source)    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)

    at sun.awt.image.ImageFetcher.run(Unknown Source)

 

单从异常信息来看,MS是从Jar包中解压缩图片时出现问题。继续查找,发现出现问题的代码位于org.mircoemu.device.j2se.J2SEDeviceDisplay类中的private Image getImage(Inpustream is)函数之中。

       本人一向较懒,遇到郁闷的问题,总喜欢google&baidu来发泄-_- 一番“众里寻它”之后,在MEsf项目中,发现有人已经提出相同的问题,甚至有细心的用户,已经指出,只要PNG图片大小超过8K就会出现该问题。这也解释了,为何游戏启动时,其他图片加载正常的原因。正当欣喜遇到同道中人之时,却发现开发者并没有解决该问题,而且该问题已经作为bug提交到ME项目的bug列表中,到目前为止,尚未解决。

       给项目开发者barto写了封陈恳的求助信,可惜直到现在还没有回复(不用抱怨了,能开源就已经很不错了,呵呵)。这次,只能靠自己了-_-

       再次启动Eclipse,喝了N杯劣质咖啡之后,终于有了眉目:getImage(Inputstream is)是在getImage(String str)中被调用的,在此,PNG图片被读入,并初始化为Inputstream。调试之中发现,出问题的PNG图片,被初始化为Inputstream之后,大小保持正常,但是,getImage(Inputstream is)中,将Inputstream转化为byte数组之后,发现该图片对应的数组大小发生了变化,小于原来的大小。然而,对于那些可正常显示的PNG图片而言,这两处的打印出来的大小是一样大的。所以,可以肯定,是getImage(Inputstream is)中的转换部分代码出了问题。思考之后,决定采用ByteArrayOutputStream来转换byte数组。

修改后代码如下:

java 代码
  1.     private Image getImage(InputStream is)   
  2.             throws IOException   
  3.     {   
  4.         //这段读取时,出问题鸟   
  5. //      final int EXTEND = 1024;   
  6. //      byte[] imageBytes = new byte[1024];   
  7. //      int num;   
  8. //      int start = 0;   
  9. //      while ((num = is.read(imageBytes, start, imageBytes.length - start)) == EXTEND) {   
  10. //          byte[] newImageBytes = new byte[imageBytes.length + EXTEND];   
  11. //          System.arraycopy(imageBytes, 0, newImageBytes, 0, imageBytes.length);   
  12. //          imageBytes = newImageBytes;   
  13. //          start += EXTEND;   
  14. //      }   
  15. //         
  16. //      if (num != 0) {   
  17. //          byte[] newImageBytes = new byte[imageBytes.length - EXTEND + num];   
  18. //          System.arraycopy(imageBytes, 0, newImageBytes, 0, imageBytes.length - EXTEND + num);   
  19. //          imageBytes = newImageBytes;   
  20. //      }   
  21.         byte[] imageBytes = new byte[512];   
  22.         ByteArrayOutputStream bout = new ByteArrayOutputStream();   
  23.         int size = 0;   
  24.         while ((size = is.read(imageBytes)) > 0) {   
  25.             bout.write(imageBytes, 0, size);   
  26.         }   
  27.         imageBytes = bout.toByteArray();   
  28.         java.awt.Image image = Toolkit.getDefaultToolkit().createImage(imageBytes);   
  29.         ImageFilter filter;   
  30.         if (isColor()) {   
  31.             filter = new RGBImageFilter();   
  32.         } else {   
  33.             if (numColors() == 2) {   
  34.                 filter = new BWImageFilter();   
  35.             } else {   
  36.                 filter = new GrayImageFilter();   
  37.             }   
  38.         }   
  39.         FilteredImageSource imageSource = new FilteredImageSource(image.getSource(), filter);   
  40.         java.awt.Image resultImage = Toolkit.getDefaultToolkit().createImage(imageSource);   
  41.         // TODO not elegant solution, maybe use ImageObserver in image.getWitdth(..) instead   
  42.         MediaTracker mediaTracker = new MediaTracker(new java.awt.Canvas());   
  43.         mediaTracker.addImage(resultImage, 0);   
  44.         try {   
  45.             mediaTracker.waitForID(0);   
  46.         } catch (InterruptedException ex) {   
  47.             Logger.error(ex);   
  48.         }   
  49.         if (mediaTracker.isErrorID(0)) {   
  50.             throw new IOException();   
  51.         }   
  52.         return new J2SEImmutableImage(resultImage);   
  53.     }  

  

修改完成之后,再次运行原游戏,OK,原来不能加载的图片正常显示了。

题外话:

虽然ME已经开发的比较健全了,但是仍然不排除还存在着各种bug。在此之前,国内的gustzhang撰写的一系列文章,在ME0.9.1版本的基础上,对其作了大量的修改,有兴趣的朋友,也可以到他blog上看看:http://blog.sina.com.cn/u/1244846070ME项目源码采用maven管理,官方推荐使用maven将源码转化为eclipse工程,但是,我是真的受不了apache网站的速度,最终选择手动创建Eclipse工程。
分享到:
评论
1 楼 xiong_panda 2007-09-16  
楼主写的不错 

相关推荐

    解决Java实现飞行棋Bug

    网上都是Java实现飞行棋,都有Bug,今天解决Bug可顺利运行,完了几把,爽;可以交作业了

    解决BugFree上传图片不能显示问题

    看到网上很多问bugfree上传图片不能保存的问题,所以研究了下与大家共享,方法不是最好但希望能帮到使用bugfree软件的朋友

    MUI 解决动态列表页图片懒加载再次加载不成功的bug问题

    在项目开发中遇到这样的功能,要求实现列表页动态加载功能,在实现过程中遇到一些小小插曲,下面小编给大家详细说明下解决方法: 首次加载时图片可以获取成功,再次加载失败,通过chrome调试发现img 的 data-lazy...

    淘宝bug展示图片

    淘宝bug展示图片

    Android drawable 玩转自定义图片以及bug的解决

    Android drawable 玩转自定义图片以及bug的解决

    Jquery.LazyLoad.js实现图片延迟加载插件

    从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案。没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了理思路,结合前...

    解决POI3.10 添加图片不成功的问题

    解决POI3.10在添加图片的时候自身有一个BUG。纠结了很久都没解决,今天终于弄好了,文件包中附带了修改好的jar包bsj-poi-ooxml-3.10-FINAL-20140208.jar。主要问题是出在:org.apache.poi.xwpf.usermodel.XWPFRun....

    IE6 PNG图片 BUG

    IE6 PNG图片 BUG 关于IE6中PNG做透明背景图片和重复背景的BUG

    解决图片放大和缩小时遇到的bug

    解决viewpager图片放大和缩小时出现的 java.lang.IllegalArgumentException: pointerIndex out of range问题的解决方法。

    IE6图片加载的一个BUG解决方法

    小图整合在一张大图里,然后在不同的CSS里调用同一张图片,以此来减少请求数,这是页面优化最常用的手段,但IE6会对页面里同一个图片,只要在不同的地方有引用到就会重新请求一次,需要加JS代码解决。

    C# 解决双击TreeView表里checkbox本身Bug问题

    一个WinForm的TreeView,某node的CheckBox... 为了解决以上问题,我重写了TreeView控件,在不影响其它地方的前提下,能很好的解决以上问题。我的环境:.Net framework4.0 + VS2005 + Win7 编译通过,并付执行程序。-

    bugfree bugfree bugfree bugfree bugfree

    bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree

    安卓完美广告无限轮播(解决图片少于3张时的bug)

    但网上的资源都没有很好解决图片小于3张时的bug。直到在apkbus上看见有人用LoopView的介绍,觉得效果不错,但是是AndroidStudio的代码。于是自己尝试转换为eclipse代码,做了一个广告轮播。解决了图片小于3张时引起...

    Visual Studio 未能加载文件或程序集解决方案

    Visual Studio 在编译C#时未能加载文件或程序集解决方案, 您一定可以通过它来解决这个问题!

    Android相机 解决三星bug版本

    最近在Android项目中使用拍照功能 , 其它型号的手机运行成功了 唯独在三星的相机上遇到了bug . BUG具体体现为 : (1) 摄像头拍照后图片数据不一定能返回 ; onActivityResult的data为空 (2) 三星的camera强制切换到...

    图片延迟加载显示代码Jquery.LazyLoad.js改良版

    从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案。没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了理思路,结合前...

    解决苹果cms采集视频图片显示失败问题

    解决苹果cmsV10采集后视频缩略图加载失败bug 将tu.php放到苹果CMS根目录下,即可解决图片加载不出来的问题

    解决三星手机照相中的BUG

    调用手机相机拍照过程中三星手机会有很多的bug,这个demo很好的解决了!!

    Java Bug模式详解

    Java.Bug模式详解 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于...

Global site tag (gtag.js) - Google Analytics