将Image对像转换为png格式的byte数组

原理上说1 获取Image 的ARGB数据2将ARGB转换成PNG存储用的的RGBA格式3RGBA格式的数据还要做些小的处理每行后面加一个byte 04用LZ77方法将RGBA格式的数组压缩5附加正确格式PNG24文件头输出即可包括IHEAD IHDR IEND IDAT外壳但是使用LZ77压缩手机上无论时间或空间都是不太能接受的还好LZ77 存在一钟无压缩的压缩方法本
摘要由CSDN通过智能技术生成
原理上说

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:路径
     * @
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,将Image对象转换byte数组可以通过以下步骤实现: ```java import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; public class ImageUtil { public static byte[] imageToByteArray(Image image, String format) throws IOException { BufferedImage bufferedImage = toBufferedImage(image); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, format, baos); byte[] bytes = baos.toByteArray(); return bytes; } private static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); bufferedImage.getGraphics().drawImage(image, 0, 0, null); return bufferedImage; } } ``` 上述代码中,我们定义了一个ImageUtil类,其中包含一个imageToByteArray()方法,用于将Image对象转换byte数组。该方法接受两个参数,第一个参数为要转换Image对象,第二个参数为转换后的图片格式,例如"jpg"、"png"等。该方法实现的具体步骤如下: 1. 将Image对象转换为BufferedImage对象,以便进行后续处理。 2. 创建一个ByteArrayOutputStream对象,用于在内存中存储转换后的byte数组。 3. 调用ImageIO.write()方法将BufferedImage对象转换为指定格式byte数组,并将转换后的byte数组写入ByteArrayOutputStream对象中。 4. 最终,通过调用ByteArrayOutputStream对象的toByteArray()方法,获取转换后的byte数组。 需要注意的是,上述代码中使用了toBufferedImage()方法将Image对象转换为BufferedImage对象,以便进行后续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值