在研发B/S视频系统时候涉及到了图片在网络中的传输,研究了一些资料,也积累了部分经验:
一。序列化后传输
图像对象可以编码成指定图像格式文件保存在硬盘上,需要时再对其进行解码读入内存。但是除了这样还有别的办法可以将图像对象保存在硬盘上吗?熟悉Java I/O 的人也许可以想到采用对象序列化(Object serialization). BufferedImage 提供一般图像管理
BufferedImage 对象包括另外两个对象:Raster 和 ColorModel。Raster 对象包含另外两个对象:DataBuffer 和 SampleModel。不幸的是,他们都没有实现序列化所必需的 Serializable 接口,所以无法直接对他们进行对象序列化。 JAI 的 javax.media.jai.remote 包里有一个类 SerializableRenderedImage,这个类实现了RenderedImage, Serializable 接口,可以将 RanderedImage 对象作为构造函数的参数实例化一个可以序列化的图像对象。
查看JDK的文档可以知道无论 Java 2D 中的 BufferedImage 还是 JAI 中的 PlanarImage 都实现了 RenderedImage 接口,也就是说所有实现自 RenderedImage
http://www.java2000.net/p13286
接口的对象均可作为参数包装出一个 SerializableRenderedImage 类型对象,将其序列化
下面是一个简单的例子说明了这个类的使用方法:
查看复制到剪切板打印
import java.io.*;
import javax.media.jai.remote.*;
import java.awt.image.*;
public class SomeSerializableClass implements Serializable ...{
protected transient RenderedImage image;
public SomeSerializableClass(RenderedImage image) ...{
this.image = image;
}
// Serialization method.
private void writeObject(ObjectOutputStream out) throws
IOException ...{
out.defaultWriteObject();
out.writeObject(new SerializableRenderedImage(image, true));
}
// Deserialization method.
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException ...{
in.defaultReadObject();
image = (RenderedImage) in.readObject();
}
}
import java.io.*;
import javax.media.jai.remote.*;
import java.awt.image.*;
public class SomeSerializableClass implements Serializable ...{
protected transient RenderedImage image;
public SomeSerializableClass(RenderedImage image) ...{
this.image = image;
}
// Serialization method.
private void writeObject(ObjectOutputStream out) throws IOException ...{
out.defaultWriteObject();
out.writeObject(new SerializableRenderedImage(image, true));
}
// Deserialization method.
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException ...{
in.defaultReadObject();
image = (RenderedImage) in.readObject();
}
}
二。以字节流的方式传输
1.图像编码
因为图像编码解码主要目的是针对图像在网络中的传输,所以编码之后的图像不必保存在硬盘上,可以直接放入一个字节数组。
查看复制到剪切板打印
public byte[] getCompressedImage(BufferedImage image){
byte[] imageData = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
imageData = baos.toByteArray();
} catch (IOException ex) {
imageData = null;
}
return imageData;
}
public byte[] getCompressedImage(BufferedImage image){
byte[] imageData = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
imageData = baos.toByteArray();
} catch (IOException ex) {
imageData = null;
}
return imageData;
}
2。图像解码
接收端接收到表示图像数据的字节数组后,对其进行解码,得到图像对象。因为我们在发送端将其编码成JPEG格式,所以可以直接在接收端使用ImageIO对其进行解码。
查看复制到剪切板打印
public BufferedImage getDecompressedImage(byte[] imageData){
try {
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
return ImageIO.read(bais);
} catch (IOException ex) {
return null;
}
}
public BufferedImage getDecompressedImage(byte[] imageData){
try {
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
return ImageIO.read(bais);
} catch (IOException ex) {
return null;
}
}
3.网络传输
因为图像编码之后是一个存在于内存中的字节数组,所以可以使用IO流的方式将其发送到网络的接收端,接收端建立链接将其接收。最常用的例如建立 Socket 连接等等。
分享到:
相关推荐
- 对于大规模的、高性能的图片传输,可能需要更复杂的缓存策略、多线程处理和错误恢复机制。 通过学习和实践"Java Socket传输图片源代码",开发者可以掌握网络编程的基本原理和技巧,为构建更复杂的分布式系统打下...
Java文件传输系统是一种基于Java编程语言开发的软件应用,它允许用户在不同的终端或网络节点之间安全、高效地传输各种类型的文件,包括图片。这样的系统通常包含一系列关键组件和技术,以确保文件的完整性和传输效率...
在本项目中,我们主要关注的是使用Java与Visual C++(VC++)进行跨平台的实时图像传输。这个"VC_java.rar"压缩包包含了相关的源代码和资源,用于实现这一功能。下面将详细讨论其中涉及的关键知识点。 1. **Java VC*...
在网络开发中,文件传输是一项重要的功能,无论是文本文件还是图像文件,都需要能够高效、稳定地在网络之间传递。本文将深入探讨使用Java实现客户端/服务器(C/S)模式的文件传输协议,并解析其实现细节。 1. **...
Java作为一种广泛使用的编程语言,提供了丰富的库和API来处理图像压缩和传输。下面将详细介绍如何使用Java实现图像的压缩和传输,以及涉及的相关知识点。 1. **图像压缩**: - **JPEG压缩**:Java支持JPEG格式的...
在Java编程中,将图片与Base64编码进行相互转换是一项常见的任务,特别是在网络传输、存储和显示图像数据时。Base64是一种用于将任意二进制数据转换为可打印ASCII字符的编码方式,这对于在HTTP协议下传输二进制数据...
文件传输功能要求能够处理各种大小和类型的文件,例如图片、音频、视频和文本文件。传输文件时,通常会涉及到文件的读取、数据包的构造、发送、接收、数据重组和写入等步骤。 为了在Java中实现文件传输,可以采用...
UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...
这个项目"用java做的图片和文件传输"就是利用Java的核心特性——Socket编程来实现实时的数据交互,包括图片和文件的发送与接收。Socket编程是TCP/IP协议的一部分,允许两台计算机通过网络进行通信。 首先,我们需要...
在IT行业中,图片防篡改是一项重要的安全技术,主要用于保护图像数据不被恶意修改。Java作为广泛应用的编程语言,提供了丰富的库和工具来实现这样的功能。在这个项目中,我们主要探讨如何利用Java实现图片的防篡改...
### Java Socket 图片传输知识点详解 #### 一、TCP协议简介 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在互联网的应用中,TCP协议提供了一种...
Java 局域网文件传输是Java编程中一个实用的技术,它允许在局域网内的不同设备之间高效地分享数据和文件。实现这一功能通常涉及到网络编程、多线程以及I/O流的使用。下面我们将详细探讨相关的Java知识点。 1. **...
在这个项目中,“Java中基于UDP的图像传输与显示(Swing界面)”意味着我们将构建一个利用UDP协议来传输图像,并通过Swing组件在客户端展示这些图像的应用。 首先,我们需要理解UDP的基础。UDP不提供连接、顺序保证或...
这种算法通常采用的方法是暗通道先验(Dark Channel Prior),通过找出图像中像素的最暗值来修复过曝区域,使得图像的对比度和亮度分布更加均匀。 去雾算法,如大气散射模型,旨在恢复因大气散射导致的图像模糊。该...
在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...
根据提供的文件信息,本文将详细解析Java中利用Socket进行文件(包括图片)传输的相关知识点。 ### Java Socket基础知识 在深入探讨文件传输之前,我们先简要回顾一下Java Socket的基础概念。Socket是一种允许不同...
在Java编程语言中,处理图片压缩是一项常见的任务,特别是在存储、传输或展示大量图像资源时。本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要...
本文将详细探讨如何利用Java实现图像化界面交互、文件传输以及DOS命令控制,以提高远程操作的效率和便利性。 1. Java远程控制基础 Java的远程方法调用(Remote Method Invocation, RMI)是实现远程控制的核心技术。...
1. **文件传输**:能够帮助用户在三星设备之间或者三星设备与其他设备之间方便地传输文件,如图片、音乐、视频、文档等,而无需借助电脑或其他第三方应用。 2. **安全无害**:“绿色无污染”意味着这个软件不含有...
Java Socket编程是网络通信的基础,尤其在开发多人聊天应用、文件传输等功能时,它是不可或缺的一部分。本项目实现了基于Java Socket的多人聊天功能,包括群聊、私聊以及文本、图片和文件的发送与接收,提供了丰富的...