`
pandonix
  • 浏览: 400572 次
  • 性别: 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  
楼主写的不错 

相关推荐

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

    在使用BugFree的过程中,用户可能会遇到上传图片后无法正常显示的问题,这通常是由配置不当或者端口冲突导致的。下面将详细解释这个问题的原因以及提供一种可能的解决方案。 1. **问题原因**: - **端口冲突**:...

    淘宝bug展示图片

    在IT行业中,"淘宝bug展示图片"这一主题主要涉及到软件开发的质量控制和用户体验优化。Bug是程序员和测试工程师日常工作中常见的问题,它指的是软件或应用中存在的错误、缺陷或异常行为。在淘宝这样的大型电子商务...

    DTcms 4.0 上传图片BUG补丁,解决方案

    总的来说,DTcms 4.0 上传图片BUG补丁是针对该版本系统中图片上传功能故障的解决方案,通过替换特定的代码文件,可以有效地修复问题。用户和开发者在应用补丁时应遵循正确步骤,并对补丁的工作原理有所了解,以便更...

    Android 图片轮播(网络加载和本地图片)

    在这个项目中,`PagerAdapter`被用来管理图片的集合,并在需要时加载图片。 网络加载图片时,项目可能采用了`Picasso`、`Glide`或者` Fresco`等流行的图片加载库。这些库能够优化图片的加载过程,处理内存和磁盘...

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

    需要注意的是,虽然这两种方式都可以在IE6中解决图片请求的bug,但它们都不是最理想的解决方案。现代的开发方法,比如CSS雪碧图和精灵图定位,已经在IE6之外的所有浏览器中得到支持。因此,在设计现代网页时,应该尽...

    [Java]PDF转图片解决中文乱码.zip

    在这个特定的压缩包文件中,"PDF2img"是一个基于PDFBox开发的DEMO,它设计用于解决PDF转图片时可能出现的中文乱码问题。 PDFBox是Apache软件基金会的一个开源项目,提供了丰富的API来读取、写入、修改PDF文档。在...

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

    然而,在实际应用中可能会遇到一个bug,即首次加载图片正常,但当用户滚动页面加载更多数据时,新加载的图片无法正确执行懒加载,导致显示不出来。本文将详细解释这个问题的原因,并提供解决方案。 首先,我们来...

    SketchUp草图 2024贴图打开纹理不显示图片BUG修复文件

    相信很好多使用,使用草图2024的朋友,都会遇到一个问题就是在新建贴图或修改贴图是点击打开不显示图片的问题 其实只需要替换一个文件就可以完美解决 "C:\Program Files\SketchUp\SketchUp 2024\resources\zh-cn\...

    解决三星手机照相中的BUG

    本话题主要聚焦在“解决三星手机照相中的BUG”这一主题,通过提供的"CameraBaozi"压缩包文件,我们可以深入探讨三星手机在拍照过程中可能出现的问题以及相应的解决方案。 首先,三星手机在拍照时可能会遇到的常见...

    mantis中的bug状态变化流程

    在Mantis中,bug的状态变化流程对于整个项目的测试和运维过程至关重要,因为它确保了问题的有效跟踪和解决。以下是对Mantis中bug状态变化流程的详细解释: ### 运维过程的bug状态变化流程 1. **问题提交**:当问题...

    oracle常用的bug问题解决

    本篇将主要围绕Oracle数据库中常见的bug问题进行讨论,并提供相应的解决策略。 一、性能相关bug 在Oracle数据库运行过程中,可能会遇到性能下降的问题,这可能由查询优化器错误、内存管理bug或者并发控制bug引起。...

    bugzilla中导出的BUG列表查看方法

    Bugzilla 中导出的 BUG 列表查看方法 Bugzilla 是一个流行的缺陷追踪系统,用于跟踪和管理软件开发中的错误和缺陷。Bugzilla 提供了多种方式来导出 BUG 列表,以便于查看和分析。在本文中,我们将介绍如何从 ...

    JEECMS的新浪图集在IE9、10不能显示大图片BUG的解决方法

    **标题:“JEECMS的新浪图集在IE9、10不能显示大图片BUG的解决方法”** 在本文中,我们将深入探讨一个针对JEECMS(Java Enterprise Edition Content Management System)系统的常见问题,即新浪图集在Internet ...

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

    在开发过程中,遇到“Visual Studio 未能加载文件或程序集解决方案”的问题,通常是由于多种原因导致的。这可能涉及到依赖项丢失、配置错误、权限问题或者是项目引用的问题。以下是一些详细的解决步骤和可能的原因...

    Bug的分类及bug的状态.docx

    Bug 是软件测试中最重要的一部分,它可以分为多种类型,每种类型都有其特点和解决方法。以下是 bug 的分类和状态: bug 的分类 1. 功能缺陷:业务流程为实现,例如某个功能没有实现或实现不正确。 2. 代码错误:...

    软件测试Bug和bug生命周期中的各种状态

    软件测试Bug和bug生命周期中的各种状态 软件测试是软件开发过程中的一个重要组成部分,其目的是为了寻找并修复软件中的错误,以提高软件的质量和可靠性。软件测试中的错误或bug是指所有会影响软件整体或部分功能的...

    IE6 PNG图片 BUG

    3. **平铺背景的BUG**:在非IE浏览器中,可以使用CSS的`background-repeat`属性轻松实现PNG图片的平铺。但IE6对PNG图片的平铺处理也有问题,可能导致图片错位、重叠或无法平铺。解决这个问题通常需要使用JavaScript...

    安卓Android源码——图片浏览器完整无BUG.zip

    在安卓开发中,图片浏览是应用中常见的功能之一,它涉及到图像加载、手势识别、内存管理等多个技术领域。本资源“安卓Android源码——图片浏览器完整无BUG.zip”提供了一个完整的图片浏览器应用源码,旨在帮助开发者...

Global site tag (gtag.js) - Google Analytics