对png格式再进行研究之后,我找到这么一条,将png文件中非关键数据块去掉之后能够将文件变小,但效果不变,因此我写了以下的算法,为了方便使用,直接做成了一个类,如下
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.util.*;
import java.io.*;
public class zipimage extends midlet
{
byte[] newpix;
public zipimage()
{
}
public void startapp()
{
zip();
}
public void pauseapp(){
}
public void destroyapp(boolean boo){
}
recordstore rs;
public void zip()
{
try
{
rs=recordstore.openrecordstore("zipimage",true);
rs.closerecordstore();
recordstore.deleterecordstore("zipimage");
rs=recordstore.openrecordstore("zipimage",true);//保证数据库里永远只有一条记录
newpix=cutchunk("/1.png");
rs.addrecord(newpix,0,newpix.length);
}
catch(exception e)
{
}
}
/*将图片中的非关键数据块去掉*/
public byte[] cutchunk(string s)
{
try
{
byte[] content;
inputstream is=getclass().getresourceasstream(s);
int m=0;
while(is.read()!=-1)
m++;
content=new byte[m];
is=null;
is=getclass().getresourceasstream(s);
is.read(content);
byte[] newchunk;
int lengplte=0;
int lengidat=0;//相应数据块的长度
int posplte=0;
int posidat=0;//相应数据块的位置
int pos=33;
for(int i=33;i
if(content[i]==0x50&&content[i+1]==0x4c
&&content[i+2]==0x54
&&content[i+3]==0x45)
{
lengplte=(content[i-4]<<24&0xff000000)+(content[i-3]<<16&0x00ff0000)+(content[i-2]<<8&0x0000ff00)+(content[i-1]&0xff)
+12;
posplte=i-4;
}
if(content[i]==0x49&&content[i+1]==0x44
&&content[i+2]==0x41
&&content[i+3]==0x54)
{
lengidat=(content[i-4]<<24&0xff000000)+(content[i-3]<<16&0x00ff0000)+(content[i-2]<<8&0x0000ff00)+(content[i-1]&0xff)
+12;
posidat=i-4;
}
}
system.out.println(lengplte);
system.out.println(lengidat);
newchunk=new byte[pos+lengplte+lengidat+12];
system.out.println(newchunk.length);
for(int i=0;i
if(i<33)
newchunk[i]=content[i];
else
if(i<33+lengplte)
newchunk[i]=content[i+(posplte-33)];
else
if(i<33+lengplte+lengidat)
newchunk[i]=content[i+(posidat-33-lengplte)];
else
newchunk[i]=content[i+(content.length-45-lengplte-lengidat)];
}
system.out.println("out");
return newchunk;
}
catch(exception e)
{
return null;
}
}
}
在使用的时候,如果是在wtk下,请将需要压缩的源图放在res目录下,并取名为1.png,然后运行程序,运行之后,请在wtk的appdb目录下相应的模拟器目录里寻找一个名叫run_by_class_storage_zip#image.db的文件,用ue打开此文件,将文件的前四行删掉(不知道怎么删的请问一下我),最后保存为你要的文件名就ok了.
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器