[Java] Наложение одного изображения поверх другого

stm6695895

В /с/ мне не ответили, попытаю счастья тут.
Вопрос, в общем, простой, но мне надо узнать, как это делается конкретно в яве.
Суть вопроса иллюстрирует следующая картинка:

Тайлы (все какие тут есть, стены, пол, мобы и главгер) - все не мои, одолжены из других игр. Тайлсеты, из которых я их взял, имеют формат *.png На всякий случай, вот они:
Фон там, по идее, прозрачный. Во всяком случае, в тех играх, где они используются, фон картинок отсутствует, например:

Но мне, почему-то, избавиться, от него так и не удалось. Я, в целом, не особо шарю во всех этих альфа-каналах, прозрачности итд. Сегодня все утро пытался самопросветиться, но так что-то ничего путного ине вышло...
Короче, прошу совета. Что надо сделать, чтобы у тайла фон заполнялся бекграундом?
Сейчас тайлы гружу командой
 ImageIO.read(new File(<pathname>.getSubimage(int, int, int, int);  

выводу на экран командой:
 drawImage(image, x, y, width, height);  

kokoc88

В голову пришло только одно быстрое решение. Попробуй сделать BufferedImage с твоими данными, типа BufferedImage.TYPE_INT_ARGB, затем пройдись по нему с помощью getRGB построчно и замени alpha у ключевого цвета на 0.

conv3rsje

Фон там, по идее, прозрачный.
У того что ты выложил фон вполне себе присутствует.
Попробуй сначала фон правильным сделать, может всё остальное тоже заработает.
ЗЫ Яву не знаю :)

stm6695895

"метод getRGB возвращает значение int, которого содержит значения альфа-канала, красного, зеленого и синего цветов, упакованные в четыре блока по 8 бит в каждом"
То есть мне для каждого пикселя исходного изображения следует получить это значение, проверить, не является ли этот цвет цветом фона (ну под это есть один из конструкторов класса Color, ок)... Ну и если является, то что дальше? Как назначить ему apha = 0 и вписать в новое изображение на соответствующее место?

stm6695895

не программными средствами можно это сделать? я имею, в виду, в сторонней проге, фотошопе, например. Не знаешь, как?

ppplva

Заменить однородный цвет на прозрачность? В фотошопе? Издеваешься?

kokoc88

Ну и если является, то что дальше? Как назначить ему apha = 0 и вписать в новое изображение на соответствующее место?
Если является, то вписать прямо в массив новое значение.

Hastya

Сделал тебе альфа-канал в ФШ, лови. Второй файл был вообще не RGB.

stm6695895

спасибо.
Ну в общем, да, действительно достаточно было удалить фон. Зря я заморачивался насчет программной обработки, все теперь ок.
Я просто и правда плохо в этом деле разбираюсь, думал почему-то, что факт прозрачности фона не означает, что он не будет отображаться в программах-просмотровщиках... Непонятно только, зачем в этих тайлсетах фон присутствует, если он все равно потом, видимо, программно исключается.
Мне показали как в фш удалять фон следующим образом: magic wand'ом ткнуть в фон, потом правой мышкой - Select Inverse, скопировать выделение в новый слой и удалить старый.
Как еще можно это сделать?

SPARTAK3959

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

Dimon89

Как еще можно это сделать?
Большинство примитивных программ просмотровиков (acdsee, irfanview, xnview, etc) умеют сохранять png с прозрачным фоном - для этого надо всего один раз ткнуть на картинку в этот самый фон, или же просто проставить галочку "считать цвет левого верхнего угла прозрачным". Это намного легче и быстрее, чем мучать для этого фотошоп.
Оставить комментарий
Имя или ник:
Комментарий: