原理上说
1 获取Image 的ARGB数据
2将ARGB转换成PNG存储用的的RGBA格式
3RGBA格式的数据还要做些小的处理每行后面加一个byte 0
4用LZ77方法将RGBA格式的数组压缩
5附加正确格式PNG24文件头输出即可包括IHEAD IHDR IEND IDAT外壳
但是使用LZ77压缩手机上无论时间或空间都是不太能接受的
还好LZ77 存在一钟无压缩的压缩方法本文的方法就是使用无压缩的方式搞定数据压缩的
1 获取Image 的ARGB数据
2将ARGB转换成PNG存储用的的RGBA格式
3RGBA格式的数据还要做些小的处理每行后面加一个byte 0
4用LZ77方法将RGBA格式的数组压缩
5附加正确格式PNG24文件头输出即可包括IHEAD IHDR IEND IDAT外壳
但是使用LZ77压缩手机上无论时间或空间都是不太能接受的
还好LZ77 存在一钟无压缩的压缩方法本文的方法就是使用无压缩的方式搞定数据压缩的
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.file.FileConnection;
import javax.microedition.io.Connector;
public class CGame extends Canvas {
//Image2Bytes by AnderLu
//生成的byte[]数组可直接用于外部存储为.png格式的图片文件看图软件可直接打开
public static int IDATPOS;
public static byte[] HEADChunk = {
(byte) 0x89, (byte) 0x50,
(byte) 0x4E, (byte) 0x47,
(byte) 0x0D, (byte) 0x0A,
(byte) 0x1A, (byte) 0x0A,
};
public static byte[] tRNSChunk = {
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x01,
(byte) 0x74, (byte) 0x52,
(byte) 0x4E, (byte) 0x53,
(byte) 0x00,
(byte) 0x40, (byte) 0xE6,
(byte) 0xD8, (byte) 0x66,
};
public static byte[] IENDChunk = {
//PNGIEND
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x49, (byte) 0x45,
(byte) 0x4E, (byte) 0x44,
(byte) 0xAE, (byte) 0x42,
(byte) 0x60, (byte) 0x82
};
Image img;
public CGame() {
Image img = null;
try {
img = Image.createImage("/cap.png");
} catch (IOException ex) {
ex.printStackTrace();
}
byte data[] = Image2Bytes(img);
this.img = Image.createImage(data, 0, data.length);
saveFile("file:///e:/a.png", data);
}
protected void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, 240, 320);
g.drawImage(img, 0, 0, 0);
}
/**保存文件
* @path:路径
* @