2012-05-26 1 views
1

Мне нужно преобразовать 2D-массив данных интенсивности пикселей изображения в градациях серого в изображение. Я пробовал это:Преобразование 2D-массива в Java в изображение

BufferedImage img = new BufferedImage(
    regen.length, regen[0].length, BufferedImage.TYPE_BYTE_GRAY); 
for(int x = 0; x < regen.length; x++){ 
    for(int y = 0; y<regen[x].length; y++){ 
     img.setRGB(x, y, (int)Math.round(regen[x][y])); 
    } 
} 
File imageFile = new File("D:\\img\\conv.bmp"); 
ImageIO.write(img, "bmp", imageFile); 

, где «регенс» представляет собой двумерную двумерную матрицу. Я получаю вывод, похожий, но не точный. Есть несколько пикселей, которые полностью противоположны тому, что должно быть (я получаю черный цвет для пикселя, который имеет значение 255). Мало серые оттенки также воспринимаются как белые. Можете ли вы сказать мне, в чем ошибка, которую я делаю?

+0

Выстрел в темноте: возможные проблемы округления с двойной Int? – Zavior

+0

Нет, это не проблема. Я думаю, что почти все пиксели уже являются целыми числами. они просто в двойном массиве. также для оставшихся немного, пиксельные значения слишком близки к int .. например: у меня есть 254.9999999999 за 255, поэтому он должен округлить до 255. –

ответ

1

BufferedImage.TYPE_BYTE_GRAY является неподписанным и неиндексированным. Кроме того,

Когда данные с не-непрозрачным альфа сохраняется в образе этого типа, цветовые данные должны быть скорректированы в не форме и предварительно умноженное альфа отбрасывается, как описано в документации AlphaComposite.

Как минимум вам необходимо исключить расширение знака и отменить все, кроме наименьших восьми бит третьего параметра, до setRGB(). Образцы данных, которые воспроизводят проблему, были бы диспозитивными.

+0

Я не думаю, что альфа-компонент может быть проблемой. потому что даже если у меня есть все значения как 255.0 в двойном массиве, я все равно получаю изображение с черными пикселями. –

+0

Вы можете проверить размеры изображения и отредактировать свой вопрос, включив в него [sscce] (http://sscce.org/), который обнаруживает проблему. – trashgod

2

Попробуйте такой код:

public void writeImage(int Name) { 
    String path = "res/world/PNGLevel_" + Name + ".png"; 
    BufferedImage image = new BufferedImage(color.length, color[0].length, BufferedImage.TYPE_INT_RGB); 
    for (int x = 0; x < 200; x++) { 
     for (int y = 0; y < 200; y++) { 
      image.setRGB(x, y, color[x][y]); 
     } 
    } 

    File ImageFile = new File(path); 
    try { 
     ImageIO.write(image, "png", ImageFile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы