在研发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传输图片源代码;短小精悍,适合初学者学习参考使用
UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...
的传输文件功能, 发现它没有文件类型的限制, 无论是图片、 音乐还是电影、 文本都能传。 同时, 对文件大 小 的 限 制 也 很 宽, 只要在 4GB 以内就可以———这足够用户的需求了。 其实 实现这一功能并不是很...
实现实时图像传输,用Java VC,VC开发Lib完成数据采集,Java开发上层图像传输
此代码为 tcp 协议传输 java socket 图片
使用java实现图像的压缩和传输,使用图像压缩算法
用java编写的,基于socket的编程,可以实现图片和文件的传输,包含了错误说明书
Java中基于UDP的图像传输与显示(Swing界面) Java中基于UDP的图像传输与显示(Swing界面)
利用java技术实现多线程文件传输
java实现的图片防篡改功能,采用图片hash生成唯一标识,再进行比对,判断图片是否被篡改过,可运行源码
文档的功能在于实现文件的传输,是网络开发中的重点,无论是文本,还是图片都可传输……,很小,很实用
实现不同端点之间的文件图片传输,并能显示传输的进度。
java-socket传输文件-图片-源码 我试过本地和局域网传输文件。 按理说,网络传输也是可以的。 效率可以。还可以写成线程操作
这是关于java tcp网络编程的课程设计。里面含有完整代码和完整的文档。
Java远程控制,实现图像化界面交互、文件传输与DOS控制
用JAVA实现的文件上传,控制台输入,保存到数据库
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
可以实现群聊,私聊,文本,图片聊天。可以发送和接收文件。支持一次同时7个文件发送/接收。接收和发送文件显示发送和接收进度。
DICOM医学图像数据接口的Java实现
本文首先介绍了利用UDP协议进行视频网络传输的优点和不足。然后,根据视频网络传输的要求扩展了UDP...最后,给出了一种在Delphi6.0下实现的视频传输的具体方法和流程。该软件能够满足多种网络平台上的视频传输的要求。