Как я могу отобразить изображение из массива значений пикселей в Java? - PullRequest
2 голосов
/ 27 мая 2011

Я намеревался отобразить изображение размером 28x28 пикселей внутри окна.Пиксели имеют значение «0», поэтому я ожидал, что оно отобразит окно с черным квадратом 28x28.Но изображение не отображается вместо.Возможно, данные массива (я точно не знаю, должны ли значения пикселей быть целыми числами в диапазоне от 0 до 255) должны быть другими, чтобы отображать изображение.Спасибо!

открытый класс ASD {

public static Image getImageFromArray(int[] pixels, int width, int height) {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    WritableRaster raster = (WritableRaster) image.getData();
    System.out.println(pixels.length + " " + width + " " + height);
    raster.setPixels(0,0,width,height,pixels);
    return image;
}

public static void main(String[] args) throws IOException {
    JFrame jf = new JFrame();
    JLabel jl = new JLabel();

    int[] arrayimage = new int[784];
    for (int i = 0; i < 28; i++)
    {   for (int j = 0; j < 28; j++)
            arrayimage[i*28+j] = 0;
    }
    ImageIcon ii = new ImageIcon(getImageFromArray(arrayimage,28,28));
    jl.setIcon(ii);
    jf.add(jl);
    jf.pack();
    jf.setVisible(true);
}

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

image.getData() возвращает копию растра.Возможно, если вы вызовете image.setData(raster) после изменения растра, вы увидите результаты.

Кроме того, setPixels должен быть присвоен массив, достаточно большой, чтобы заполнить все полосы (A, R, G, B) растра,Я получал индекс массива за исключением границ, пока не увеличил размер пикселей до 28 * 28 * 4.

. Для TYPE_INT_RGB следующее должно выдавать белое изображение:

public class ASD
{
  public static Image getImageFromArray(int[] pixels, int width, int height)
  {
    BufferedImage image =
        new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    WritableRaster raster = (WritableRaster) image.getData();
    raster.setPixels(0, 0, width, height, pixels);
    image.setData(raster);
    return image;
  }

  public static void main(String[] args) throws IOException
  {
    JFrame jf = new JFrame();
    JLabel jl = new JLabel();

    //3 bands in TYPE_INT_RGB
    int NUM_BANDS = 3;
    int[] arrayimage = new int[28 * 28 * NUM_BANDS];

    for (int i = 0; i < 28; i++)
    {
      for (int j = 0; j < 28; j++) {
        for (int band = 0; band < NUM_BANDS; band++)
          arrayimage[((i * 28) + j)*NUM_BANDS + band] = 255;
      }
    }
    ImageIcon ii = new ImageIcon(getImageFromArray(arrayimage, 28, 28));
    jl.setIcon(ii);
    jf.add(jl);
    jf.pack();
    jf.setVisible(true);
  }
}
1 голос
/ 27 мая 2011

Я не знаю, это проблема, но вы используете TYPE_INT_ARGB . Это включает в себя альфа-канал ( opacy ) в упакованном целом числе, значение 0 означает полностью прозрачный.

Еще один (прочитайте документы !):

BufferedImage.getData() :  The Raster returned is a copy of the image data is not updated if the image is changed.

Вы должны вызвать setData (), чтобы разместить новые пиксели внутри изображения, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...