#java #image
#java #изображение
Вопрос:
Я намеревался отобразить изображение размером 28×28 пикселей внутри окна. Пиксели имеют значение «0», поэтому я ожидал, что оно отобразит окно с черным квадратом 28×28. Но вместо этого изображение не отображается. Возможно, данные массива (я не знаю наверняка, должны ли значения пикселей быть int в диапазоне от 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);
}
Ответ №1:
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. Я изменил: 1) размер массива на 28*28*3 (все значения 0), 2)От TYPE_INT_ARGB до TYPE_INT_RGB, 3) и вызывается image.setData (растр) после SetPixels. Но изображение по-прежнему не отображается.
2. @Alexander, приведенный выше ваш код изменен для получения белого изображения. У меня все равно это работает… Вы получаете JFrame, или ваша программа завершается без какого-либо эффекта?
Ответ №2:
Я не знаю, в чем проблема, но вы используете TYPE_INT_ARGB. Это включает альфа-канал (непрозрачность) в упакованном целом числе, значение 0 означает полную прозрачность.
Еще один (читайте документы!):
BufferedImage.getData() : The Raster returned is a copy of the image data is not updated if the image is changed.
Я думаю, вы должны вызвать setData (), чтобы поместить новые пиксели внутри изображения.
Комментарии:
1. Хорошо, я изменил его на TYPE_INT_RGB; но проблема сохраняется. А также изображение не отображается независимо от значений массива, будь то 0 или любое другое значение. Спасибо.
2. Массив должен иметь размер = width height * 3 для каждого канала; где 0 ..width height содержит значения red, width height 1.. 2 * ширина высота — значения зеленого цвета и 2 * ширина высота 1.. ширина высота * 3 значения синего цвета? Спасибо.
3.
TYPE_INT_RGB
объединяет три выборки (по одной для каждого пикселя), которые составляют пиксель, в одно целое число.