解决MiroEmulator中加载图片的Bug
作者:pandonix
日期:2007年9月8日
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:http://pandonix.iteye.com
前段时间一直在研究MiroEmulator(以下简称ME),这一个纯Java实现的J2me模拟器,支持Applet、Swt以及Swing多个版本的模拟器。关于ME的介绍,请参考CleverPig的MiroEmulator使用入门中文版:
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来发泄-_- 一番“众里寻它”之后,在ME的sf项目中,发现有人已经提出相同的问题,甚至有细心的用户,已经指出,只要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 代码
- private Image getImage(InputStream is)
- throws IOException
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- byte[] imageBytes = new byte[512];
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- int size = 0;
- while ((size = is.read(imageBytes)) > 0) {
- bout.write(imageBytes, 0, size);
- }
- imageBytes = bout.toByteArray();
- java.awt.Image image = Toolkit.getDefaultToolkit().createImage(imageBytes);
- ImageFilter filter;
- if (isColor()) {
- filter = new RGBImageFilter();
- } else {
- if (numColors() == 2) {
- filter = new BWImageFilter();
- } else {
- filter = new GrayImageFilter();
- }
- }
- FilteredImageSource imageSource = new FilteredImageSource(image.getSource(), filter);
- java.awt.Image resultImage = Toolkit.getDefaultToolkit().createImage(imageSource);
-
- MediaTracker mediaTracker = new MediaTracker(new java.awt.Canvas());
- mediaTracker.addImage(resultImage, 0);
- try {
- mediaTracker.waitForID(0);
- } catch (InterruptedException ex) {
- Logger.error(ex);
- }
- if (mediaTracker.isErrorID(0)) {
- throw new IOException();
- }
- return new J2SEImmutableImage(resultImage);
- }
修改完成之后,再次运行原游戏,OK,原来不能加载的图片正常显示了。
题外话:
虽然ME已经开发的比较健全了,但是仍然不排除还存在着各种bug。在此之前,国内的gustzhang撰写的一系列文章,在ME0.9.1版本的基础上,对其作了大量的修改,有兴趣的朋友,也可以到他blog上看看:http://blog.sina.com.cn/u/1244846070ME项目源码采用maven管理,官方推荐使用maven将源码转化为eclipse工程,但是,我是真的受不了apache网站的速度,最终选择手动创建Eclipse工程。
分享到:
相关推荐
网上都是Java实现飞行棋,都有Bug,今天解决Bug可顺利运行,完了几把,爽;可以交作业了
看到网上很多问bugfree上传图片不能保存的问题,所以研究了下与大家共享,方法不是最好但希望能帮到使用bugfree软件的朋友
在项目开发中遇到这样的功能,要求实现列表页动态加载功能,在实现过程中遇到一些小小插曲,下面小编给大家详细说明下解决方法: 首次加载时图片可以获取成功,再次加载失败,通过chrome调试发现img 的 data-lazy...
淘宝bug展示图片
Android drawable 玩转自定义图片以及bug的解决
从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案。没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了理思路,结合前...
解决POI3.10在添加图片的时候自身有一个BUG。纠结了很久都没解决,今天终于弄好了,文件包中附带了修改好的jar包bsj-poi-ooxml-3.10-FINAL-20140208.jar。主要问题是出在:org.apache.poi.xwpf.usermodel.XWPFRun....
IE6 PNG图片 BUG 关于IE6中PNG做透明背景图片和重复背景的BUG
解决viewpager图片放大和缩小时出现的 java.lang.IllegalArgumentException: pointerIndex out of range问题的解决方法。
小图整合在一张大图里,然后在不同的CSS里调用同一张图片,以此来减少请求数,这是页面优化最常用的手段,但IE6会对页面里同一个图片,只要在不同的地方有引用到就会重新请求一次,需要加JS代码解决。
一个WinForm的TreeView,某node的CheckBox... 为了解决以上问题,我重写了TreeView控件,在不影响其它地方的前提下,能很好的解决以上问题。我的环境:.Net framework4.0 + VS2005 + Win7 编译通过,并付执行程序。-
bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree
但网上的资源都没有很好解决图片小于3张时的bug。直到在apkbus上看见有人用LoopView的介绍,觉得效果不错,但是是AndroidStudio的代码。于是自己尝试转换为eclipse代码,做了一个广告轮播。解决了图片小于3张时引起...
Visual Studio 在编译C#时未能加载文件或程序集解决方案, 您一定可以通过它来解决这个问题!
最近在Android项目中使用拍照功能 , 其它型号的手机运行成功了 唯独在三星的相机上遇到了bug . BUG具体体现为 : (1) 摄像头拍照后图片数据不一定能返回 ; onActivityResult的data为空 (2) 三星的camera强制切换到...
从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案。没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了理思路,结合前...
解决苹果cmsV10采集后视频缩略图加载失败bug 将tu.php放到苹果CMS根目录下,即可解决图片加载不出来的问题
调用手机相机拍照过程中三星手机会有很多的bug,这个demo很好的解决了!!
Java.Bug模式详解 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于...