Intellij Idea getResourceAsStream()在Maven项目中找不到资源

aamkag61  于 2024-01-05  发布在  Maven
关注(0)|答案(2)|浏览(167)

我在一个基于Maven的Java项目中加载图像资源时遇到了问题。文件似乎正确地放置在src/main/resources目录中,但我一直收到一个错误,即找不到图像。我是处理文件和图像的新手。我正在编写一个小程序,可以获取图像并将其输出为ASCII艺术。我让它工作了一段时间,然后它停止工作。
第一个月
文件树:

  1. ImageConverter
  2. └───src
  3. ├───main
  4. ├───java
  5. └───(my packages)
  6. └───resources
  7. └───cat.png
  8. └───test

字符串
相关图像类代码:

  1. import javax.imageio.ImageIO;
  2. import java.awt.image.BufferedImage;
  3. import java.io.IOException;
  4. import java.net.URL;
  5. public class Image {
  6. // Reference https://paulbourke.net/dataformats/asciiart/
  7. private static final String DEFAULTIMAGE = "cat.png";
  8. private static final String ASCIICHARS = ".'`^\\\",:;Il!i><~+_-?][}{1)(|\\\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$"; // taken from https://medium.com/@shubham0473/unleash-your-inner-artist-a-step-by-step-guide-to-converting-images-to-ascii-art-using-java-97860464f19a
  9. private static final double MAX_LUMINANCE = 196964.0;
  10. private BufferedImage img;
  11. public Image(){
  12. this(DEFAULTIMAGE);
  13. }
  14. public Image(String filename) {
  15. try {
  16. URL input = getClass().getClassLoader().getResource(filename);
  17. //InputStream input = Image.class.getResourceAsStream(filename);
  18. System.out.println(input);
  19. if (input==null) {
  20. System.err.println("Image not found in resources: " + filename);
  21. return;
  22. }
  23. this.img = ImageIO.read(input);
  24. } catch (IOException e){
  25. System.err.println("Error loading image: " + filename);
  26. e.printStackTrace();
  27. }
  28. }
  29. public BufferedImage getImg(){
  30. return this.img;
  31. }
  32. public String toString(){
  33. // use convertToASCII to create the string to be printed to the console.
  34. char[][] ASCIItable = convertToASCII(this.img);
  35. StringBuilder s = new StringBuilder();
  36. for (char[] table : ASCIItable){
  37. for (char cell : table){
  38. s.append(cell);
  39. }
  40. s.append("\n");
  41. }
  42. return s.toString();
  43. }
  44. public char[][] convertToASCII(BufferedImage img){
  45. // https://en.wikipedia.org/wiki/Relative_luminance
  46. FastRGB pixels = new FastRGB(img);
  47. char[][] ASCII_array = new char[img.getWidth()][img.getHeight()];
  48. for (int y = 0; y < img.getHeight(); y++){
  49. for (int x = 0; x < img.getWidth(); x++){
  50. short[] currentPixel = pixels.getRGB(x, y);
  51. double r = currentPixel[0];
  52. double g = currentPixel[1];
  53. double b = currentPixel[2];
  54. double rr = Math.pow(r, 2.2);
  55. double gg = Math.pow(g, 2.2);
  56. double bb = Math.pow(b, 2.2);
  57. double luminance = rr * 0.2126 + gg * 0.7152 + bb * 0.0722;
  58. char luminanceChar = luminanceToASCII(luminance);
  59. ASCII_array[x][y] = luminanceChar;
  60. }
  61. }
  62. return ASCII_array;
  63. }
  64. public char luminanceToASCII(double n){
  65. n = ((n / MAX_LUMINANCE) * ASCIICHARS.length()) - 1;
  66. if (n < 0)
  67. n = 0;
  68. return ASCIICHARS.charAt((int)n);
  69. }
  70. }


打印URL输入将打印null。我尝试了以下方法:

  • 说明cat.png直接位于resources文件夹中。
  • 确保src/main/resources在IDE中标记为资源根。
  • 使用getClass().getClassLoader().getResource(filename)代替。
  • 使用InputStream和File对象。
  • 同一文件夹中的3个不同图像。
  • 尝试使用文件系统上的绝对路径加载映像。

我真的希望我没有粗心大意,使用git,这样我至少可以恢复到工作状态.建议?我希望我没有错过一些明显的东西。

iyr7buue

iyr7buue1#

编辑:我修好了!我使用intellij项目结构在intellij中重新创建了项目,复制了我所有的类文件,创建了一个resources文件夹,标记为resources route,现在它可以工作了。文件夹结构如下所示:

  1. ImageConverter2
  2. ├───.idea
  3. ├───out
  4. └───production
  5. └───ImageConverter2
  6. ├───resources
  7. └───src

字符串

vbkedwbf

vbkedwbf2#

我用下面的结构做了一个基本的测试


的数据
(Maven应该是IDE不可知的,所以实际上IDE应该是无关紧要的)
然后我用了...

  1. BufferedImage image = ImageIO.read(getClass().getResource("/images/mandalorian.jpg"));

字符串
而且...

  1. BufferedImage image = ImageIO.read(getClass().getClassLoader().getResource("images/mandalorian.jpg"));


两者都奏效了。
作为个人偏好,我更喜欢第一种,因为我可以根据自己的意愿在相对路径和绝对路径之间切换。
在你的情况下,我会考虑:

  • 检查生成的.jar文件并确保包含图像
  • 清理和重建Maven项目(即mvn clean install或IDE提供的任何东西)
展开查看全部

相关问题