【问题标题】:can a jpeg image be generated programatically?可以以编程方式生成 jpeg 图像吗?
【发布时间】:2014-05-28 20:54:46
【问题描述】:

我正在对包含这一行的代码块进行单元测试

ExifSubIFDDirectory directory = ImageMetadataReader
    .readMetadata(new File(uploadedFile.currentPath))
    .getDirectory(ExifSubIFDDirectory.class)

ImageMetadataReader 需要一个 jpeg 文件,否则代码会失败。我尝试用这个

创建一个jpeg文件
LocalDate localDate = LocalDate.now()
def filePath = localDate.toString() + ".jpeg"
def fileStore = new File(filePath);
fileStore.createNewFile(); // creates file with .jpeg extension

尽管使用 jpeg 扩展名制作文件,但它知道它不是图像,我明白了

not a jpeg file
com.drew.imaging.jpeg.JpegProcessingException: not a jpeg file
    at com.drew.imaging.jpeg.JpegSegmentReader.readSegments(JpegSegmentReader.java:212)
    at com.drew.imaging.jpeg.JpegSegmentReader.<init>(JpegSegmentReader.java:107)
    at com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(JpegMetadataReader.java:70)
    at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:108)
    at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:95)
    at com.witsmd.pronghorn.ConvertToDicomService.$tt__getExifTimestamp(ConvertToDicomService.groovy:164)
    at com.witsmd.pronghorn.ConvertToDicomServiceSpec.(ConvertToDicomServiceSpec.groovy:156)

我可以在我的项目中放置一个实际的 jpeg 文件并将其用作示例,但我更愿意创建一个图像,保存它,测试方法,然后删除 jpeg 文件。这可能吗?

【问题讨论】:

标签: unit-testing grails


【解决方案1】:

程序完全不关心文件扩展名。这种误解有点像 Windows 的错误——文件​​扩展名最初只是为了让人们弄清楚文件做了什么。大多数文件格式都有所谓的标题部分,它定义了应该如何阅读文档。 HTML 和 XML 都是很好的例子。因此,您不能只传递带有 *.jpg 扩展名的任何文件并期望它能够正常工作。

如果您想手动创建 JPEG 文件,则必须阅读规范并找到一个可以从原始数据写入它们的 grails 库。不过,我怀疑这些知识对您的测试是否至关重要,并建议保持简单。

【讨论】:

    【解决方案2】:

    你可以使用这个java类来生成一个随机的jpeg图像文件

    import javax.imageio.IIOImage;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriteParam;
    import javax.imageio.ImageWriter;
    import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
    import javax.imageio.stream.ImageOutputStream;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    public class JpegGenerator {
    
        public static void generate(String fileName, int width, int height, int pixSize) throws Exception {
            int x, y = 0;
    
            BufferedImage bi = new BufferedImage(pixSize * width, pixSize * height, BufferedImage.TYPE_3BYTE_BGR);
    
            Graphics2D g = (Graphics2D) bi.getGraphics();
    
            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    x = i * pixSize;
                    y = j * pixSize;
    
                    if ((i * j) % 6 == 0) {
                        g.setColor(Color.GRAY);
                    } else if ((i + j) % 5 == 0) {
                        g.setColor(Color.BLUE);
                    } else {
                        g.setColor(Color.WHITE);
                    }
    
                    g.fillRect(y, x, pixSize, pixSize);
    
                }
    
            }
    
            g.dispose();
    
            saveToFile(bi, new File(fileName));
    
        }
    
        /**
         * Saves jpeg to file
         */
    
        public static void saveToFile(BufferedImage img, File file) throws IOException {
    
            ImageWriter writer = null;
    
            java.util.Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
    
            if (iter.hasNext()) {
                writer = (ImageWriter) iter.next();
            }
    
            ImageOutputStream ios = ImageIO.createImageOutputStream(file);
    
            writer.setOutput(ios);
    
            ImageWriteParam param = new JPEGImageWriteParam(java.util.Locale.getDefault());
    
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    
            param.setCompressionQuality(0.98f);
    
            writer.write(null, new IIOImage(img, null, null), param);
    
        }
    
    }
    

    示例调用:

    JpegGenerator.generate("/tmp/myfile.jpg",100,100,5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多