图片的下载、修改分辨率、上传
图片:下载、修改分辨率、上传
一、题目
服务器上有图片 地址为123.57.73.15:8080/a.jpg,完成以下需求
- 使用java程序将该图片下载到本地
- 将图片分辨率修改为256*256并重命名为a_XXX.jpg
- 将修改后的图片重新上传回服务器,上传接口为 123.57.73.15:8080/uploadImage 参数为图片的二进制文件
二、代码
package com.ccjiuhong.assessment;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* 服务器上有图片 地址为123.57.73.15:8080/a.jpg
* 1. 使用java程序将该图片下载到本地
* 2. 将图片分辨率修改为256*256并重命名为a_XXX.jpg
* 3. 将修改后的图片重新上传回服务器,上传接口为 123.57.73.15:8080/uploadImage 参数为图片的二进制文件
*
*/
public class ImageHandler {
public static void main(String[] args) throws IOException {
// restful 风格: 增删改查
// 1. 使用java程序将该图片下载到本地,
// 如果用RestTemplate,需要将请求文件封装一下,有springframework.web包就可以用 RestTemplate
RestTemplate restTemplate = new RestTemplate();
byte[] forEntity = restTemplate.getForObject("http://123.57.73.15:8080/a.jpg", byte[].class);
//泛型:byte[].class byte数组
//如果用:getForObject 和 getForEntity,则包装成返回实体,加一个状态码判断,但是还要get一层
//创建path用get,这种写法是相对路径,也可以写成E:\\,这样就是绝对路径
Path path = Paths.get("src", "main", "resources", "a.jpg");
//转成绝对路径,debug就可以看了,这两行代码没有什么用
// Path absolutePath = path.toAbsolutePath();
// System.out.println(absolutePath);
if (forEntity != null) {
Files.write(path, forEntity);
//Files 可以读出来所有的字节,变成字节数组
//所以也可以都写出去,就是write,第一个参数是路径、第二个参数是数组
}
// 2. 将图片分辨率修改为256*256并重命名为a_XXX.jpg
// 把图片文件读出来,读出来的是一个 BufferedImage,缓存到内存的,处理图片的一个类
BufferedImage image = ImageIO.read(path.toFile());
Image scaledInstance = image.getScaledInstance(256, 256, Image.SCALE_SMOOTH);
// 改分辨率就是重新画一遍,输出画出来
BufferedImage newImage = new BufferedImage(256, 256,BufferedImage.TYPE_INT_RGB );
// BufferedImage.TYPE_INT_RGB : 表示一个图像,该图像具有整数像素的 8 位 RGB 颜色
//getGraphics :获取到画笔对象 drawImage:画对象
newImage.getGraphics().drawImage(scaledInstance, 0, 0, null);
/*
* java中可以处理的图片是以下3种格式的:
* jpg png bmp
* bmp :位图,原始的图片,没有经过压缩
* png :是有 透明通道的
* rgba中的a表示透明通道,java是可以选择rgb还是rgba的
*/
Path imagePath = Paths.get("src", "main", "resources", "a_lh.jpg");
//改变分辨率之后,写出去
ImageIO.write(newImage, "jpg", Files.newOutputStream(imagePath));
//上传
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(newImage, "jpg", outputStream);
byte[] bytes = outputStream.toByteArray();
// 3. 将修改后的图片重新上传回服务器,上传接口为 123.57.73.15:8080/uploadImage 参数为图片的二进制文件
HttpHeaders pictureHeader = new HttpHeaders();
pictureHeader.setContentType(MediaType.IMAGE_JPEG);
//不设置此 contentDisposition 则会报file必填
pictureHeader.setContentDispositionFormData("file","a_lh.jpg");
//setContentDispositionFormData:传的 formdata 的名字
//文件上传前,byte数组的资源文件,用ByteArrayResource来包装
ByteArrayResource bar = new ByteArrayResource(bytes);
HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bar, pictureHeader);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", picturePart);
RequestEntity<Object> request = RequestEntity.post(URI.create("http://123.57.73.15:8080/upload"))
.body(body);
ResponseEntity<String> entity = restTemplate.postForEntity("http://123.57.73.15:8080/upload", request, String.class);
System.out.println(entity);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效