图片:下载、修改分辨率、上传

图片:下载、修改分辨率、上传

一、题目

服务器上有图片 地址为123.57.73.15:8080/a.jpg,完成以下需求

  1. 使用java程序将该图片下载到本地
  2. 将图片分辨率修改为256*256并重命名为a_XXX.jpg
  3. 将修改后的图片重新上传回服务器,上传接口为 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 参数为图片的二进制文件
 *
 * @author G. Seinfeld
 * @since 2020-09-22
 */
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);
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值