云
8 小时以前 a7cf1913c376b53f487f0ef8dfff084c5bc010a7
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
@@ -9,6 +9,9 @@
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -17,6 +20,7 @@
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.FilterOutputStream;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
@@ -138,9 +142,25 @@
    public static void writeZipEntry(ZipOutputStream zip, QrLabelInfo label) throws IOException {
        BufferedImage image = createQrLabel(label.getCode(), label.getFileName());
        zip.putNextEntry(new ZipEntry(label.getFileName() + ".png"));
        ImageIO.write(image, "png", zip);
        try {
            // ImageIO.write(OutputStream) 可能为每张图片创建磁盘缓存;大批量导出改用内存缓存。
            // 包装流的 close 仅 flush,不能关闭外层 ZIP。
            ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
            try (ImageOutputStream imageOut = new MemoryCacheImageOutputStream(new FilterOutputStream(zip) {
                @Override
                public void close() throws IOException {
                    flush();
                }
            })) {
                writer.setOutput(imageOut);
                writer.write(image);
            } finally {
                writer.dispose();
            }
        } finally {
        zip.closeEntry();
    }
    }
    // ==================== 私有方法 ====================