我遇到了在j2me中加载图片的问题
我可以在哪里上传j2me模拟器的某些类型的图像,但对于一些它不加载
所以有什么问题?意味着可以在扩展Canvas类的类中加载哪种类型的图像?是否应该上传特定的图像尺寸或类型?
答案 0 :(得分:1)
我不确定您到底在寻找什么,但您所描述的行为听起来很像您遇到OutOfMemory异常。尝试减少图像的尺寸(堆使用基于维度)并查看行为是否停止。这将告诉您它是否真的是OutOfMemory问题或其他问题。
其他提示:
1)将图像从最大到最小加载。这有助于堆碎片并为最大的图像提供最大的堆空间。 2)卸载(设置为null),与您加载和垃圾收集的方式相反。调用GC后,请确保Thread.yield()。 3)确保只加载所需的图像。从应用程序不再存在的状态卸载图像。 4)由于您正在创建精灵,因此一个图像可能有多个精灵。考虑创建一个图像池,以确保只加载一次图像。然后只需将每个Sprite对象指向它所需的池中的图像。您的问题中的示例似乎很可能不止一次将相同的图像加载到内存中。这很浪费,可能是OutOfMemory问题的一部分。
答案 1 :(得分:1)
我猜这个问题是以下原因之一:
1.资源名称:
资源名称区分大小写;例如, /ellen-png.png 与 /ellen-png.PNG 或任何其他变体不同。
2.Format:
唯一必须支持的格式是png。有些手机可能支持其他格式,例如:
但这取决于设备,如果你想成为跨平台,那么只需使用png:
1999年,当Sun Microsystems开发了J2ME平台规范及其支持API时,PNG被选为默认图像格式,因为它具有图形功能,文件小,并且不受专利问题的影响。
要确定J2ME是否处理特定媒体格式,请调用getSupportedContentTypes方法。此方法返回支持的媒体类型的字符串数组,并包括音频和视频格式以及图像格式。字符串以MIME类型格式显示此信息。例如,要检查GIF支持,请扫描此数组,查找GIF MIME类型字符串。如果匹配,则手机的J2ME实现支持GIF文件的原生显示。此代码段代码可用于此目的:
private String mediaTypes[];
private final String GIF_MIME_TYPE = "image/gif";
private boolean gifSupported;
// Get the media types to check for support of GIF file display
mediaTypes = Manager.getSupportedContentTypes(null);
int count = mediaTypes.length;
// Check list for GIF MIME type; set support flag if present
gifSupported = false;
for (int i = 0; i < count; i++) {
if (mediaTypes[i] == GIF_MIME_TYPE)
gifSupported = true;
} // end for
如果您要使用特殊格式,可以使用特殊解码器从不支持的格式解码图像 如果资源不存在(特别是不正确的资源名称),无法加载数据,或者图像数据无法解码,createImage将抛出 java.io.IOException 。如果您捕获此异常,请检查每个案例。
3.Size:
请注意,特定设备可以加载的JAR文件的大小取决于多种因素,包括手机制造商和运营商施加的限制,甚至特定设备上的可用内存配置。图像文件大小必须在9.1千字节范围内,GIF到69.5 TIF的Kbytes。当然,因为你可能想让它们尽可能小,你可能想尝试像pngcrush这样的工具。其主要目的是通过尝试各种压缩级别和PNG过滤方法来减小PNG IDAT数据流的大小。
参考文献:
SDN FAQ - What image types does MIDP support?
gamedev.net - Image Formats in J2ME
drdobbs.com - Displaying GIF Images on J2ME Mobile Phones