我正在测试一行包含此行的代码
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文件。这可能吗?
答案 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