当我尝试从手机存储器加载图像时,我得到 Out Of Memory errorjava / lang / OutOfMemoryError或nativedecodeImage 。手机内存中的一些图像为12kd,而其他一些图像则为589kb或600kb。将小尺寸图像提取到列表中,但是当涉及到较大尺寸的图像时,它会抛出OOM错误。
这是我的代码
FileConnection finalConnection;
try
{
fc.close();
finalConnection = (FileConnection) Connector.open(path, Connector.READ_WRITE);
if(finalConnection.exists())
{
InputStream fis = finalConnection.openInputStream();
long overallSize = finalConnection.fileSize();
int length = 0;
byte[] imageData = new byte[0];
while (length < overallSize)
{
byte[] data = new byte[CHUNK_SIZE];
int readAmount = fis.read(data, 0, CHUNK_SIZE);
byte[] newImageData = new byte[imageData.length + CHUNK_SIZE];
System.arraycopy(imageData, 0, newImageData, 0, length);
System.arraycopy(data, 0, newImageData, length, readAmount);
imageData = newImageData;
length += readAmount;
}
fis.close();
finalConnection.close();
System.out.println("LENGTH IS " + length);
if (length > 0)
{
image = Image.createImage(imageData, 0, length);
}
}
else
{
System.out.println("NO PATH FOR IMAGE");
}
}
catch (Exception e)
{
System.out.println("Image.createImage(imageData, 0, length) " +e.toString());
}
catch(Error e)
{
System.out.println("Image.createImage " + e);
}
我收到错误的地方是
image = Image.createImage(imageData, 0, length);
有没有人对此有所了解。我坚持了几天这件事。我正在研究S40设备诺基亚311. Netbeans MIDP 2.0
答案 0 :(得分:0)
线索是例外......你打开的图像太大而无法存放在内存中。请记住,图像的压缩大小不一定表示它是否可以保持,它实际上与像素数有关。
如果它太大你就无法做到......如果你想在屏幕上显示图像,你需要先对它进行一些处理才能将它缩小,然后才能将它加载到内存中。
答案 1 :(得分:0)
大多数仅启用JavaME的设备在这方面都受到限制,并且您无法以该大小加载图像。
但也许你不需要。
许多相机会生成所拍照片的缩略图版本 - 并在EXIF数据中包含此缩略图。因此,当您需要在手机上显示照片列表时,不会加载整张照片。您只需从文件中的exif数据加载缩略图数据。
我在这一天只是对此进行了简单的实验。在网上找到了一些应该做的技巧的源代码,但很少有用。这可能部分是因为我测试的手机没有在exif数据中保存缩略图。也许阿莎311呢?