java – 我能告诉BufferedImage最初的文件类型是什么吗?

前端之家收集整理的这篇文章主要介绍了java – 我能告诉BufferedImage最初的文件类型是什么吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的代码中,我有一个 BufferedImage加载了 ImageIO类,如下所示:
  1. BufferedImage image = ImageIO.read(new File (filePath);

稍后,我想将其保存为字节数组,但ImageIO.write方法要求我选择GIF,PNG或JPG格式来编写我的图像(如教程here中所述).

我想选择与原始图像相同的文件类型.如果图像最初是GIF,我不希望将其保存为PNG的额外开销.但如果图像最初是PNG,我不想失去半透明性,并将其保存为JPG或GIF.有没有办法可以从BufferedImage中确定原始文件格式是什么?

我知道我可以简单地解析文件路径,当我加载图像以找到扩展名并将其保存以供日后使用时,但理想情况下我喜欢直接从BufferedImage执行此操作.

解决方法

正如@JarrodRoberson所说,BufferedImage没有“格式”(即没有文件格式,它确实有几种像素格式之一,或像素“布局”).我不知道Apache Tika,但我想他的解决方案也可行.

但是,如果您更喜欢仅使用ImageIO而不是在项目中添加新的依赖项,则可以编写如下内容

  1. ImageInputStream input = ImageIO.createImageInputStream(new File(filePath));
  2.  
  3. try {
  4. Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
  5.  
  6. if (readers.hasNext()) {
  7. ImageReader reader = readers.next();
  8.  
  9. try {
  10. reader.setInput(input);
  11.  
  12. BufferedImage image = reader.read(0); // Read the same image as ImageIO.read
  13.  
  14. // Do stuff with image...
  15.  
  16. // When done,either (1):
  17. String format = reader.getFormatName(); // Get the format name for use later
  18. if (!ImageIO.write(image,format,outputFileOrStream)) {
  19. // ...handle not written
  20. }
  21. // (case 1 done)
  22.  
  23. // ...or (2):
  24. ImageWriter writer = ImageIO.getImageWriter(reader); // Get best suitable writer
  25.  
  26. try {
  27. ImageOutputStream output = ImageIO.createImageOutputStream(outputFileOrStream);
  28.  
  29. try {
  30. writer.setOutput(output);
  31. writer.write(image);
  32. }
  33. finally {
  34. output.close();
  35. }
  36. }
  37. finally {
  38. writer.dispose();
  39. }
  40. // (case 2 done)
  41. }
  42. finally {
  43. reader.dispose();
  44. }
  45. }
  46. }
  47. finally {
  48. input.close();
  49. }

猜你在找的Java相关文章