- 浏览: 5819840 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
原理上说
1 获取Image 的ARGB数据
2将ARGB转换成PNG存储用的的RGBA格式
3RGBA格式的数据还要做些小的处理每行后面加一个byte 0
4用LZ77方法将RGBA格式的数组压缩
5附加正确格式PNG24文件头输出即可包括IHEAD IHDR IEND IDAT外壳
但是使用LZ77压缩手机上无论时间或空间都是不太能接受的
还好LZ77 存在一钟无压缩的压缩方法本文的方法就是使用无压缩的方式搞定数据压缩的
附件zip可改名为jar在手机上直接执行
内附有源代码
需要手机支持JSR75有E盘(就是存储卡)生成的文件为a.png
可使用任意的看图软件打开
N73,6270测试成功
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:路径 * @fileData:文件数据 * @return: 0:出现异常,1:保存成功 */ public int saveFile(String path, byte[] fileData) { FileConnection fc = null; try { fc = (FileConnection) Connector.open(path, Connector.READ_WRITE); if (!fc.exists()) { fc.create(); } OutputStream os = fc.openOutputStream(); os.write(fileData); os.flush(); os.close(); fc.close(); return 1; } catch (IOException ex) { ex.printStackTrace(); return 0; } } public byte[] Image2Bytes(Image img) { try { int w = img.getWidth(); int h = img.getHeight(); int offset = 0; byte buffer[] = new byte[(w * 4 + 1) * h + offset]; getImageBufferForImageARGB8888(img, buffer, w, h, offset); System.gc(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dout = new DataOutputStream(baos); WritePng(dout, w, h, buffer, null, false, offset); byte[] data = baos.toByteArray(); writeCRC(data, 8); //更新IHDR CRC writeCRC(data, 33); //更新PLTE CRC writeCRC(data, IDATPOS); //更新IDAT CRC buffer = null; System.gc(); return data; } catch (IOException ex) { ex.printStackTrace(); return null; } } public static void writeCRC(byte[] data, int chunkpos) { int chunklen = ((data[chunkpos] & 0xFF) << 24) | ((data[chunkpos + 1] & 0xFF) << 16) | ((data[chunkpos + 2] & 0xFF) << 8) | (data[chunkpos + 3] & 0xFF); int sum = CRCChecksum(data, chunkpos + 4, 4 + chunklen) ^ 0xffffffff; int val = sum; int pos = chunkpos + 8 + chunklen; data[pos] = (byte) ((val & 0xFF000000) >> 24); data[pos + 1] = (byte) ((val & 0xFF0000) >> 16); data[pos + 2] = (byte) ((val & 0xFF00) >> 8); data[pos + 3] = (byte) (val & 0xFF); } public static int[] crc_table; //CRC 表 public static int CRCChecksum(byte[] buf, int off, int len) { int c = 0xffffffff; int n; if (crc_table == null) { int mkc; int mkn, mkk; crc_table = new int[256]; for (mkn = 0; mkn < 256; mkn++) { mkc = mkn; for (mkk = 0; mkk < 8; mkk++) { if ((mkc & 1) == 1) { mkc = 0xedb88320 ^ (mkc >>> 1); } else { mkc = mkc >>> 1; } } crc_table[mkn] = mkc; } } for (n = off; n < len + off; n++) { c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>> 8); } return c; } public static long adler32(long adler, byte[] buf, int index, int len) { int BASE = 65521; int NMAX = 5552; //TODO remove this function at all if (buf == null) { return 1L; } long s1 = adler & 0xffff; long s2 = (adler >> 16) & 0xffff; int k; while (len > 0) { k = len < NMAX ? len : NMAX; len -= k; while (k >= 16) { s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; s1 += buf[index++] & 0xff; s2 += s1; k -= 16; } if (k != 0) { do { s1 += buf[index++] & 0xff; s2 += s1; } while (--k != 0); } s1 %= BASE; s2 %= BASE; } return (s2 << 16) | s1; } public static void WritePng(DataOutputStream output, int width, int height, byte[] buffer, byte[] colors, boolean Transparent, int offset) throws IOException { int adler = (int) adler32(1l, buffer, offset, buffer.length - offset); byte[] lenNlen = { //压缩块的LEN和NLEN信息 (byte) 0, (byte) 0xfa, (byte) 0x7e, (byte) 0x05, (byte) 0x81 }; IDATPOS = 0; output.write(HEADChunk); IDATPOS += HEADChunk.length; //写IHDR output.writeInt(13); //len output.writeInt(1229472850); //IHDR type code output.writeInt(width); //写宽度 output.writeInt(height); //写高度 output.writeByte(8); //1Bitdepth if (colors == null) { output.writeByte(6); //2ColorType } else { output.writeByte(3); //2ColorType } output.writeByte(0); //3CompressionMethod output.writeByte(0); //4Filter method output.writeByte(0); //5Interlace method output.writeInt(0); //写crc IDATPOS += 25; //写PLTE if (colors != null) { output.writeInt(colors.length); //len output.writeInt(1347179589); //type code output.write(colors); //data output.writeInt(0); //crc IDATPOS += colors.length + 12; } //写TRNS if (Transparent) { output.write(tRNSChunk); IDATPOS += tRNSChunk.length; } //写IDAT byte[] dpixels = buffer; int bufferlen = dpixels.length - offset; int blocklen = 32506; int blocknum = 1; if ((dpixels.length % blocklen) == 0) { blocknum = bufferlen / blocklen; } else { blocknum = (bufferlen / blocklen) + 1; } int IDATChunkLen = (bufferlen + 6 + blocknum * 5); output.writeInt(IDATChunkLen); //len output.writeInt(1229209940); //idat type code output.writeShort((short) 0x78da); //78da for (int i = 0; i < blocknum; i++) { int off = i * blocklen; int len = bufferlen - off; if (len >= blocklen) { len = blocklen; lenNlen[0] = (byte) 0; } else { lenNlen[0] = (byte) 1; } int msb = (len & 0xff); int lsb = (len >>> 8); lenNlen[1] = (byte) msb; lenNlen[2] = (byte) lsb; lenNlen[3] = (byte) (msb ^ 0xff); lenNlen[4] = (byte) (lsb ^ 0xff); output.write(lenNlen); output.write(dpixels, off + offset, len); } output.writeInt(adler); //IDAT adler output.writeInt(0); //IDAT crc output.write(IENDChunk); } public static void getImageBufferForImageARGB8888(Image img, byte[] rawByte, int w, int h, int off) { int n = off; int[] raw = new int[w]; for (int j = 0; j < h; j++) { img.getRGB(raw, 0, w, 0, j, w, 1); for (int i = 0; i < raw.length; i++) { int ARGB = raw[i]; int a = (ARGB & 0xff000000) >> 24; int r = (ARGB & 0xff0000) >> 16; int g = (ARGB & 0xff00) >> 8; int b = ARGB & 0xff; if (i % w == 0) { n += 1; } rawByte[n] = (byte) r; rawByte[n + 1] = (byte) g; rawByte[n + 2] = (byte) b; rawByte[n + 3] = (byte) a; n += 4; } } raw = null; System.gc(); } }
附件zip可改名为jar在手机上直接执行
内附有源代码
需要手机支持JSR75有E盘(就是存储卡)生成的文件为a.png
可使用任意的看图软件打开
N73,6270测试成功
发表评论
-
3个RPG练习,最后一个是卡马克卷轴
2010-12-11 18:02 2361import javax.microedition.lcd ... -
j2me小练习,教学用
2010-12-07 20:42 1846有用的J2ME功能函数 ... -
自己早期做的一个基于j2me的飞行射击类游戏
2010-12-07 20:23 2130早期的代码,MVC思想 -
自己早期做的一个基于j2me的魔塔
2010-12-07 20:13 2103上面一个不完整,但代码好(MVC),但没抽出类; 下面一个比 ... -
j2me中的A*算法
2010-12-02 14:08 2065import javax.microedition.mid ... -
j2me代理连接返回码总是400的问题
2010-09-21 16:24 2769400是因为错误的语法导致服务器无法理解请求信息。 Con ... -
当显示内容过多时的滚屏类Container.java
2010-09-16 11:32 2169很多时候,由于手机屏幕太小,一下子显示不了那么多内容,这个时候 ... -
j2me读取中文的配置文件
2010-09-14 20:25 2167还可以参考这篇文章: http://gundumw100.it ... -
使用jsr172解析xml
2010-09-14 10:40 1963基类: import java.io.ByteArrayI ... -
面向对象的RMS操作
2010-09-14 10:29 1715将需要保存的数据集中起来形成一个model类,并且要实现序列化 ... -
Java版数独算法实现
2010-09-10 16:32 16361数独的历史: 数独前身为“九宫格”,最早起源于中国。数千 ... -
使用KXML解析xml数据
2010-09-10 13:05 9335最近做项目,服务器传过来的都是Xml格式的数据,需要解析xml ... -
类似小球列表的选择控件(9宫格)
2010-08-27 15:50 1763import javax.microedition.lcd ... -
j2me工具类:TextUtil.java
2010-08-11 21:24 1711import java.util.Vector; i ... -
j2me工具类:Database.java
2010-08-11 21:18 2023/** * <p>Title: & ... -
j2me工具类:ReadFromFile.java
2010-08-11 21:15 4341import java.io.*; import jav ... -
j2me竖向滚动菜单的基本做法
2010-08-11 16:58 2033public class AppCanvas extend ... -
j2me工具类:声音播放类SoundUtil
2010-06-04 23:21 2135用法: 将需要播放的音乐都罗列在name,type数组中,需要 ... -
j2me工具类:PalettedImage调色板类
2010-06-04 22:57 1808该方法网上可以找到,我添加了一个重载函数: public Im ... -
地图编辑器Mappy下载
2010-05-25 22:30 3331简单的手机游戏地图编辑器,共享之。。。 eclipseme下 ...
相关推荐
### 转换byte数组为Image #### 方法二:`bytesToImage`函数解析 与之相对,将字节数组转换回`Image`对象的过程则较为直接: 1. **创建图像对象**:使用`Toolkit.getDefaultToolkit().createImage()`方法,直接将...
### Image与Byte数组之间的转换知识点详解 #### 一、知识点概览 在处理图像数据时,经常需要将图像对象(Image)转换为字节数组(Byte[])或者反之进行操作。这样的需求常见于网络传输、文件存储以及其他需要将图像...
### Java将图片转换为byte数组及反向转换的知识点总结 #### 一、知识点概述 在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,...
2、把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示。 3、从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上。 这里的Image是System.Drawing.Image。 以下三个函数分别实现了上述三个...
把图片(jpg、png)转换成byte[]比特流流的小工具。
2、把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示。 3、从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上。 这里的Image是System.Drawing.Image。 //Get an image from file Image...
在C#编程中,图像(Image)与字节(Byte)数组之间的转换是常见的操作之一,尤其是在处理图像数据、网络传输或存储时尤为常见。本文将详细介绍如何在C#中实现图像与字节数组之间的相互转换,并提供具体的代码示例。 ...
把图片(jpg、png)转换成Base64的小工具。
在处理这些文件时,我们通常会将它们转换为字节数组流,以便于存储和网络传输。 标签“vue2字节流byte[]文件”提示我们这个话题可能与Vue2框架结合使用字节数组流的方式有关。Vue是一个流行的前端JavaScript框架,...
本文将详细探讨如何在Java、Python和C#这三种常用编程语言中实现图像(Image)与字节数组(byte[])之间的相互转换。 **Java中的转换** 1. **Image转byte[]** 在Java中,我们可以使用`FileInputStream`读取图片...
PropertyBag 对象可以将图片框中的图片保存为 Byte() 数组,并可以从 Byte() 数组读取图片。其保存和读取的格式都是使用了原始格式,即:如果你的图片框读入的是 Jpg 图片格式,则保存的 Byte() 数组也是该 Jpg 格式...
我们可以使用ToArray()方法将Stream中的数据转换为byte数组。 ```csharp byte[] imageBytes = memoryStream.ToArray(); // 将Stream转换为byte数组 ``` ### byte[]到Stream转换 要将byte数组转换回Stream,我们...
将Image转换为Base64String,我们可以遵循以下步骤: 1. 加载Image:首先,我们需要将Image对象的Source设置为要转换的图像。这可以通过创建BitmapImage对象并设置其UriSource属性完成。 ```csharp BitmapImage ...
在处理图像数据时,有时我们需要将图像对象(Image)转换为字节数组(Byte Array),或者反之。这在数据传输、存储或网络通信中非常常见。本篇将详细介绍如何使用C#实现Image与Byte Array之间的转换,并基于提供的...
将Bitmap转换为byte数组,通常是为了便于在网络上传输或存储到文件中。这个过程涉及压缩,可以选择不同的压缩格式和质量。 ```java private byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ...
标题中的“取图标返回png字节集”指的是一个编程任务,即从某个程序或资源中获取图标,并将其转换为PNG图像格式的字节数据。在IT领域,这通常涉及到操作系统接口调用、图像处理和二进制数据操作。在Windows环境中,...
因此,我们需要先将Bitmap转换为byte数组,然后通过Intent的putExtra()方法传递这个字节数组。接收端再将接收到的字节数组还原为Bitmap。 以下是具体实现步骤: 1. **Bitmap转byte数组**: 在发送端,我们创建一...
在C#中,图片本质上是一个二进制数据流,可以通过文件流(FileStream)读取图片文件并将其转换为字节数组(byte[])。`GetPictureData`函数就是一个这样的例子,它接受一个图片路径作为参数,然后创建一个FileStream对象...