Java не создает файл изображения (используя ImageIO) - PullRequest
0 голосов
/ 25 июня 2018

Мне дали задание, в котором я должен прочитать два изображения из вторичной памяти и сохранить их в двух отдельных матрицах.Затем я должен умножить эти матрицы и преобразовать полученную матрицу обратно в изображение и сохранить его на жестком диске.Вот код:

package ISI;

import java.io.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import javax.imageio.ImageIO;
import javax.swing.*;

class ImageMultiplication {

  BufferedImage img1, img2;
  File f1, f2;
  int matrix1[][], matrix2[][], matrix3[][];
  int w,h;

  ImageMultiplication() { 
      img1 = img2 = null; 
      f1 = f2 = null;
      w = 500;
      h = 400;
  }

  void readImages() throws IOException {
      f1 = new File("image1.jpg");
      f2 = new File("image2.jpg");
      img1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
      img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
      img1 = ImageIO.read(f1);
      img2 = ImageIO.read(f2);
      System.out.println("\nReading of images complete");
  }

  void convertToMatrix() {
      int [] array1 = new int[w*h];
      matrix1 = new int[h][w];
      int [] array2 = new int[w*h];
      matrix2 = new int[w][h];
      matrix3 = new int[h][h];
      try {
          img1.getRGB(0, 0, w, h, array1, 0, w);
          img2.getRGB(0, 0, w, h, array2, 0, w);

      }
      catch(Exception e) {
          System.out.println("\nInterrupted");
      }

      int count=0;

      for(int i=0;i<h;i++) {
          for(int j=0;j<w;j++) {
              if(count == array1.length)
                  break;
              matrix1[i][j] = array1[count];
              count++;
          }
      }

      count=0;

      for(int i=0;i<w;i++) {
          for(int j=0;j<h;j++) {
              if(count == array2.length)
                  break;
              matrix2[i][j]=array2[count];
              count++;
          }
      }

      int sum = 0, c, d, k;
      for (c = 0; c < h; c++) {
          for (d = 0; d < h; d++) {
              for (k = 0; k < w; k++) 
                  sum = sum + matrix1[c][k] * matrix2[k][d]; 
          matrix3[c][d] = sum;
          sum = 0;
          }
      }  

      /* Comment snippet 1
      for(int i = 0; i<h; i++) {
          for(int j = 0; j<h; j++)
              System.out.print(" "+matrix3[i][j]);
          System.out.println();
      }
      */        
  }

  void convertMatrixToImage() {
      BufferedImage image = new BufferedImage(w, h,  BufferedImage.TYPE_INT_RGB);
      try {
          for(int i=0; i<h; i++) {
              for(int j=0; j<h; j++) {
                  int a = matrix3[i][j];
                  Color newColor = new Color(a,a,a);
                  image.setRGB(j,i,newColor.getRGB());
              }
          }
          ImageIO.write(image, "jpg", new File("Output.jpg"));
      }
      catch(Exception e) {}
      System.out.println(image.toString());
      System.out.println("\nThe output image has been generated!");         
  }

  public static void main(String [] args) throws IOException {
      ImageMultiplication i = new ImageMultiplication();
      i.readImages();
      i.convertToMatrix();
      i.convertMatrixToImage();
  }

}

Файл выполняется без проблем.

См.

Проблема, однако, в том, что в каталоге не создается и не записывается файл изображения (void convertMatrixToImage()).Если я раскомментирую (comment snippet 1), я получу 2D матрицу в качестве вывода в окне консоли, где каждый индекс показывает числовое значение, которое я предполагаю равным пиксельному значению RGB.Но нет никаких признаков какого-либо файла изображения, когда-либо создаваемого.Может ли кто-нибудь помочь мне?

Примечание. Я попытался преобразовать массив в байтовый массив , а затем записать файл изображения, а также попробовал другие методы, но, похоже, ничего не работает.Я попробовал это даже на Windows, но у него также есть та же проблема.Нигде не создается Output.jpg .

1 Ответ

0 голосов
/ 25 июня 2018

Когда я запускаю ваш модифицированный код для печати Exception, я получаю ...

java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
    at java.awt.Color.testColorValueRange(Color.java:310)
    at java.awt.Color.<init>(Color.java:395)
    at java.awt.Color.<init>(Color.java:369)
    at javaapplication194.ImageMultiplication.convertMatrixToImage(JavaApplication194.java:102)
    at javaapplication194.ImageMultiplication.main(JavaApplication194.java:118)

Теперь, честно говоря, я понятия не имел, что означает это "на самом деле",но я знаю, что это как-то связано с "цветом"

Так что я оглянулся на код разговора ...

try {
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < h; j++) {
            int a = matrix3[i][j];
            Color newColor = new Color(a, a, a);
            image.setRGB(j, i, newColor.getRGB());
        }
    }
    ImageIO.write(image, "jpg", new File("Output.jpg"));
} catch (Exception e) {
    e.printStackTrace();
}

И заметил ...

int a = matrix3[i][j];
Color newColor = new Color(a, a, a);
image.setRGB(j, i, newColor.getRGB());

Это кажется мне очень странным по ряду причин ...

  1. Вы используете getRGB, чтобы получить упакованный цвет int значение
  2. Выпопробуйте сделать новый цвет из этого упакованного int
  3. Вы используете getRGB для возврата упакованного int из цвета на основе упакованного int

Всечто кажется неправильным и ненужным, у вас уже есть упакованное значение int RGB, почему бы просто не использовать

int a = matrix3[i][j];
//Color newColor = new Color(a, a, a);
image.setRGB(j, i, a);

, добавив это, ошибка исчезнет и образ будет создан

...