- Java数字图像处理
- DIP - 首页
- DIP - 简介
- DIP - Java BufferedImage类
- DIP - 图像下载与上传
- DIP - 图像像素
- DIP - 灰度转换
- DIP - 增强图像对比度
- DIP - 增强图像亮度
- DIP - 增强图像锐度
- DIP - 图像压缩技术
- DIP - 添加图像边框
- DIP - 图像金字塔
- DIP - 基本阈值化
- DIP - 图像形状转换
- DIP - 高斯滤波器
- DIP - 方框滤波器
- DIP - 腐蚀与膨胀
- DIP - 水印
- DIP - 卷积理解
- DIP - Prewitt算子
- DIP - Sobel算子
- DIP - Kirsch算子
- DIP - Robinson算子
- DIP - Laplacian算子
- DIP - 加权平均滤波器
- DIP - 创建缩放效果
- DIP - 开源库
- DIP - OpenCV简介
- DIP - OpenCV灰度转换
- DIP - 颜色空间转换
- DIP有用资源
- DIP - 快速指南
- DIP - 有用资源
- DIP - 讨论
图像下载与上传
本章我们将学习如何从互联网下载图像,对图像进行一些图像处理技术,然后将处理后的图像上传到服务器。
下载图像
为了从网站下载图像,我们使用名为URL的Java类,它位于java.net包下。其语法如下:
String website = "https://tutorialspoint.com"; URL url = new URL(website);
除了上述方法外,URL类中还有其他方法,简要描述如下:
| 序号 | 方法与描述 |
|---|---|
| 1 |
public String getPath() 返回URL的路径。 |
| 2 |
public String getQuery() 返回URL的查询部分。 |
| 3 |
public String getAuthority() 返回URL的授权部分。 |
| 4 |
public int getPort() 返回URL的端口。 |
| 5 |
public int getDefaultPort() 返回URL协议的默认端口。 |
| 6 |
public String getProtocol() 返回URL的协议。 |
| 7 |
public String getHost() 返回URL的主机。 |
示例
以下示例演示了如何使用Java URL类从互联网下载图像:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class Download {
public static void main(String[] args) throws Exception {
try{
String fileName = "digital_image_processing.jpg";
String website = "https://tutorialspoint.com/java_dip/images/"+fileName;
System.out.println("Downloading File From: " + website);
URL url = new URL(website);
InputStream inputStream = url.openStream();
OutputStream outputStream = new FileOutputStream(fileName);
byte[] buffer = new byte[2048];
int length = 0;
while ((length = inputStream.read(buffer)) != -1) {
System.out.println("Buffer Read of length: " + length);
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
} catch(Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
}
输出
执行上述代码后,将看到以下输出。
它将从服务器下载以下图像。
上传图像
让我们看看如何将图像上传到Web服务器。我们将BufferedImage转换为字节数组以便将其发送到服务器。
我们使用Java类ByteArrayOutputStream,它位于java.io包下。其语法如下:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "jpg", baos);
为了将图像转换为字节数组,我们使用ByteArrayOutputStream类的toByteArray()方法。其语法如下:
byte[] bytes = baos.toByteArray();
除了上述方法外,ByteArrayOutputStream类中还有其他方法,简要描述如下:
| 序号 | 方法与描述 |
|---|---|
| 1 |
public void reset() 此方法将字节数组输出流的有效字节数重置为零,以便丢弃流中所有累积的输出。 |
| 2 |
public byte[] toByteArray() 此方法创建一个新分配的字节数组。其大小将是输出流的当前大小,缓冲区的内容将被复制到其中。它返回输出流的当前内容作为字节数组。 |
| 3 |
public String toString() 将缓冲区内容转换为字符串。转换将根据默认字符编码进行。它返回从缓冲区内容转换的字符串。 |
| 4 |
public void write(int w) 它将指定的数组写入输出流。 |
| 5 |
public void write(byte []b, int of, int len) 它将从偏移量off开始的len个字节写入流。 |
| 6 |
public void writeTo(OutputStream outSt) 它将此流的全部内容写入指定的流参数。 |
示例
以下示例演示了如何使用ByteArrayOutputStream将图像上传到服务器:
客户端代码
import javax.swing.*;
import java.net.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Client{
public static void main(String args[]) throws Exception{
Socket soc;
BufferedImage img = null;
soc=new Socket("localhost",4000);
System.out.println("Client is running. ");
try {
System.out.println("Reading image from disk. ");
img = ImageIO.read(new File("digital_image_processing.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
byte[] bytes = baos.toByteArray();
baos.close();
System.out.println("Sending image to server. ");
OutputStream out = soc.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.writeInt(bytes.length);
dos.write(bytes, 0, bytes.length);
System.out.println("Image sent to server. ");
dos.close();
out.close();
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
soc.close();
}
soc.close();
}
}
服务器代码
import java.net.*;
import java.io.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;
class Server {
public static void main(String args[]) throws Exception{
ServerSocket server=null;
Socket socket;
server = new ServerSocket(4000);
System.out.println("Server Waiting for image");
socket = server.accept();
System.out.println("Client connected.");
InputStream in = socket.getInputStream();
DataInputStream dis = new DataInputStream(in);
int len = dis.readInt();
System.out.println("Image Size: " + len/1024 + "KB");
byte[] data = new byte[len];
dis.readFully(data);
dis.close();
in.close();
InputStream ian = new ByteArrayInputStream(data);
BufferedImage bImage = ImageIO.read(ian);
JFrame f = new JFrame("Server");
ImageIcon icon = new ImageIcon(bImage);
JLabel l = new JLabel();
l.setIcon(icon);
f.add(l);
f.pack();
f.setVisible(true);
}
}
输出
客户端输出
执行客户端代码后,客户端将显示以下输出:
服务器端输出
执行服务器代码后,服务器端将显示以下输出:
服务器接收图像后,将显示如下图像: