java实现图片转化为字节流,字节流还原成图片

最近,在研究图片转化为字节流以及字节流还原成图片的,

项目下载地址:http://download.csdn.net/detail/u010627840/9397506

代码如下:

package com.mybatis.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class TestImage {
	
	 public static void main(String[] args) throws Exception
	    {
	        //先模拟一个图形byte[]
	        byte[] b1 =image2Bytes("d:\\1.jpg");
	        //存为文件
	        buff2Image(b1,"d:\\test.jpg");
	 
	        System.out.println("Hello World!");
	    }
	 
	 static void buff2Image(byte[] b,String tagSrc) throws Exception
	    {
	        FileOutputStream fout = new FileOutputStream(tagSrc);
	        //将字节写入文件
	        fout.write(b);
	        fout.close();
	    }
	 
	 static byte[] image2Bytes(String imgSrc) throws Exception
	    {
	        FileInputStream fin = new FileInputStream(new File(imgSrc));
	        //可能溢出,简单起见就不考虑太多,如果太大就要另外想办法,比如一次传入固定长度byte[]
	        byte[] bytes  = new byte[fin.available()];
	        //将文件内容写入字节数组,提供测试的case
	        fin.read(bytes);
	        
	        fin.close();
	        return bytes;
}
	 
}

如何判断图片类型  

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.MemoryCacheImageInputStream;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator; 
/**
 *  根据字节流获取图片类型
 * */
public static String getImageType(byte[] imageBytes) {
    try {
        MemoryCacheImageInputStream memoryCacheImageInputStream = new MemoryCacheImageInputStream(new ByteArrayInputStream(imageBytes));
        Iterator<ImageReader> itr = ImageIO.getImageReaders(memoryCacheImageInputStream);
        while (itr.hasNext()) {
            ImageReader reader = itr.next();
            String imageName = reader.getClass().getSimpleName();
            if (imageName != null) {
                if ("JPEGImageReader".equalsIgnoreCase(imageName)){
                    return "jpeg";
                }
                if ("JPGImageReader".equalsIgnoreCase(imageName)) {
                    return "jpg";
                }
                if ("pngImageReader".equalsIgnoreCase(imageName)) {
                    return "png";
                }
            }
        }
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return null;
}

 如何改变图片格式

//把这个jpg图像写到这个流中去,这里可以转变图片的编码格式
boolean resultWrite = ImageIO.write(bu, "jpg", imageStream);

 

 

### 回答1: 在 Java 中,序列化是将对象的状态信息换为可以存储或传输的形式的过程。序列化可以将对象的状态信息存储在磁盘上或以网络流的形式传输到另一台计算机。 在 Java 中,序列化有以下几种常见用途: 1. 在分布式系统中传输对象。 2. 在 Web 应用程序中将对象存储在 session 中。 3. 将对象的状态信息持久化到磁盘上。 4. 使用 RMI (Remote Method Invocation) 远程调用时,需要将方法参数和返回值序列化。 5. 使用 JMS (Java Message Service) 发送消息时,需要将消息体序列化。 总之,序列化是在 Java 中存储和传输对象状态信息的常用方法。 ### 回答2: 在Java中,序列化是将对象转化字节流的过程,以便能够在网络上传输或者存储在文件中。以下是为什么要在Java中进行序列化的几个原因: 1. 对象持久化:通过序列化,可以将对象转化字节流,并将其存储在文件或者数据库中。这样,即使程序关闭,对象的状态仍然可以被保留下来,应用程序重新启动后可以重新加载之前保存的对象。 2. 网络通信:在网络通信中,数据需要在不同的机器之间传输。通过序列化,可以将对象转化字节流,使得数据可以在网络上传输。接收方可以通过反序列化将字节流转化回对象,从而实现对象的传输。 3. 分布式计算:在分布式计算环境中,不同的计算机可能需要共享数据。通过序列化,可以将对象转化字节流,使得对象可以在不同的计算机之间传输,从而实现数据的共享和交互。 4. 缓存和高速存储:序列化可以将对象转化字节流,使得对象可以被缓存或者存储在高速存储设备中,提高数据的读取和写入速度。 需要注意的是,在进行序列化时,要考虑对象的版本兼容性问题。如果对象的结构或者字段发生变化,可能会导致反序列化失败。因此,在进行序列化时,需要对对象进行版本控制,以确保兼容性。 ### 回答3: 在Java中,序列化是将对象转化字节流的过程,可以用于网络传输、数据存储和分布式计算等场景。以下是为什么要序列化的几个主要原因: 1. 网络传输:在网络传输中,数据通常以字节流的形式进行传输。使用序列化可以将Java对象转化字节流,方便在网络中传输。接收方可以将字节流还原为Java对象,这样就能够在不同的机器之间传递数据。 2. 持久化存储:序列化允许将Java对象转化字节流,并将其存储在磁盘等介质上。这样可以实现Java对象永久保存下来,在下次程序启动时恢复对象的状态。这对于需要频繁保存和恢复数据的应用场景非常有用。 3. 分布式计算:在分布式计算中,需要将任务或数据分发给不同的节点进行处理。通过序列化,可以将Java对象转化字节流,并在不同的节点之间传递。这样能够提高分布式计算的效率和性能。 4. 缓存和消息传递:在缓存和消息传递中,序列化可以用于将Java对象转化字节流,方便在不同的应用程序之间传递数据。这样可以实现数据的快速传递和共享,提升系统的响应速度和吞吐量。 总之,Java中序列化是为了方便对象在不同场景的传输和存储。通过将对象转化字节流,可以实现对象的持久化存储、网络传输、分布式计算和消息传递等应用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值