可以通过编程方式生成jpeg图像吗?

时间:2014-05-27 23:20:59

标签: unit-testing grails

我正在测试一行包含此行的代码

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文件。这可能吗?

2 个答案:

答案 0 :(得分:3)

程序对文件扩展名不太关心。这种误解是Windows的错误 - 文件扩展最初只是为了让人类弄清楚文件的作用。大多数文件格式都有所谓的标题部分,用于定义文档的读取方式; HTML和XML都是很好的例子。因此,您不能传递任何带有* .jpg扩展名的文件,并期望它能够正常工作。

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

答案 1 :(得分:0)

您可以使用此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