如何在不创建 File 对象的情况下将 BufferedImage 附加到 MimeBodyPart

Phi*_*kis 4 java jakarta-mail

我正在创建 aBufferedImage并尝试将其包含到 a 中MimeBodyPart ,如下所示:

BufferedImage img=generateQR(otp);
messageBodyPart = new MimeBodyPart();
File test = new File("phill.png");
ImageIO.write(img, "png", test);
DataSource fds = new FileDataSource(test);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setFileName("./phill.png");
messageBodyPart.setHeader("Content-ID", "<image>");
multipart.addBodyPart(messageBodyPart);
test.delete();
Run Code Online (Sandbox Code Playgroud)

有没有办法在BufferedImage不创建 a的情况下附加a File

请假设

  • generateQR() 存在
  • 有一个 HTML MimeBodyPart

Arn*_*aud 5

按照建议,您可以从图像中获取字节,并使用相应的数据源。

这是基于以下问题:

Java-将缓冲图像转换为字节 [] 而不写入磁盘

javamail问题:如何在不创建文件的情况下附加文件

你可能会得到类似的结果:

byte[] imageBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();

ByteArrayDataSource bds = new ByteArrayDataSource(imageBytes, "image/png"); 
messageBodyPart.setDataHandler(new DataHandler(bds)); 
messageBodyPart.setFileName("./phill.png");
messageBodyPart.setHeader("Content-ID", "<image>");
multipart.addBodyPart(messageBodyPart);
Run Code Online (Sandbox Code Playgroud)

编辑 :

由于数据缓冲区可能并不总是 a DataBufferByte,因此您可以将图像数据放入字节数组中:

代替

byte[] imageBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)

具有以下操作:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
byte[] imageBytes= baos.toByteArray();
baos.close();
Run Code Online (Sandbox Code Playgroud)

(示例灵感来自How I can convert BufferedImage to a byte array without using files