【发布时间】:2020-07-08 17:59:34
【问题描述】:
我从休息控制器收到一个MultipartFile Spring 对象。我正在尝试将任何 inage 文件转换为 JPG 图像但我只需要字节数组将其保存在 mongoDb
我发现这段代码可以做到这一点
public boolean convertImageToJPG(InputStream attachedFile) {
try {
BufferedImage inputImage = ImageIO.read(attachedFile);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
boolean result = ImageIO.write(inputImage, "jpg", byteArrayOutputStream);
return result;
} catch (IOException e) {
System.err.println("Error " + e);
}
return false;
}
但是result 作为false 没有错误,所以ImageIO.write 不起作用
我也发现这样做也可以,但使用File 对象,我不想create 目录上的文件,我只需要字节数组
public static boolean convertFormat(String inputImagePath,
String outputImagePath, String formatName) throws IOException {
FileInputStream inputStream = new FileInputStream(inputImagePath);
FileOutputStream outputStream = new FileOutputStream(outputImagePath);
// reads input image from file
BufferedImage inputImage = ImageIO.read(inputStream);
// writes to the output image in specified format
boolean result = ImageIO.write(inputImage, formatName, outputStream);
// needs to close the streams
outputStream.close();
inputStream.close();
return result;
}
测试
public class TestImageConverter {
public static void main(String[] args) {
String inputImage = "D:/Photo/Pic1.jpg";
String oututImage = "D:/Photo/Pic1.png";
String formatName = "PNG";
try {
boolean result = ImageConverter.convertFormat(inputImage,
oututImage, formatName);
if (result) {
System.out.println("Image converted successfully.");
} else {
System.out.println("Could not convert image.");
}
} catch (IOException ex) {
System.out.println("Error during converting image.");
ex.printStackTrace();
}
}
}
我该如何解决我的问题?
【问题讨论】:
-
尝试“jpeg”而不是“jpg”
-
@Tarik 没用
-
你确定图片读取解码成功了吗?通过打印图像大小、几个像素值来确认。
-
@Tarik Spring
MultipartFile成功给了我字节数组、大小、输入流、上下文类型 -
我曾经做过一个将 jpg 转换为 jpg(灰度)的脚本,我记得那很痛苦。我有一个来自 ImageIO.read(File f) 的 BufferedImage 然后我循环了 image.height 和 image.width 并用 image.getRGB(x,y) 提取了 rgb 做了一些计算然后 image.setRGB(x,y,rgbaInt )。 rgb 的顺序出乎意料 (b/g/r)。是不是您必须将 rgb 转换为 rgba 才能使用 png 格式?可能是 png 的格式实际上存储为 a/r/g/b。因为这样你也可以在没有 alpha 通道的情况下存储它。
标签: java spring-boot inputstream javax.imageio multipartfile