2016-06-27 9 views
1

Скажем, у меня есть PNG изображения с прозрачностью, например, так: sword with transparent backgroundНаполните сложный образ с цветом

Я хочу, в Java, чтобы заполнить только объект черным цветом, например, так: sword filled with black

Это довольно простой процесс в Photoshop, но это процесс, который я бы хотел повторить часто, в идеале, не делая черную картинку для каждого объекта, для которого я хотел бы это сделать. Я пробовал несколько классов обнаружения границ, но не нашел успеха.

Как бы это осуществить?

Дополнительная информация: это будет быстрый и грязный способ создания теней. Если вы можете придумать лучший способ, это решило бы эту проблему полностью.

+2

Работает ли базовая маска на непрозрачных пикселях? Кроме того, это не ** тривиальный процесс в Photoshop; Photoshop делает это *** кажется *** как * тривиальный * процесс. –

+0

Это правда. Маска, безусловно, могла бы работать - как бы я сгенерировал маску из изображения? –

+0

Не могли бы вы перебрать каждый пиксель и проверить значение альфа? Если это не прозрачно, установите пиксель в черный? – meepzh

ответ

2

Вы можете сделать функцию, которая пересекает все пиксели и заполняет их черным цветом.

BufferedImage image = ... 
Color fillColor = new Color(0, 0, 0); // Black 

for (int y = 0; y < image.getHeight(); y++) { 
    for (int x = 0; x < image.getWidth(); x++) { 
     int color = image.getRGB(x, y); 
     int alpha = (color >> 24) & 0xff; 

     if (alpha == 255) { 
      image.setRGB(x, y, fillColor.getRGB()); 
     } 
    } 
} 

Очевидно, что это будет работать только на полностью непрозрачных пикселях. Если изображение сверху содержит некоторую прозрачность, вы также можете изменить условие на толерантность: if (alpha > 127). Это заполнит все пиксели, которые будут менее 50% прозрачными.

+0

С помощью нескольких изменений (_alpha! = 0_, _fillColor.getRGB() _) он отлично работает для меня! Спасибо. Как я спросил meepzh, будет ли это сталкиваться с проблемами эффективности с большими изображениями или делать несколько сразу? –

+0

Oups, я отредактировал код, чтобы отразить изменения! Лучший способ - попробовать, но это самый быстрый способ достичь того, что вы хотели с Java, поэтому вам не следует сталкиваться с проблемами производительности. – Simon

+0

Отлично, спасибо! –

0

В рамках Photoshop вы можете использовать что-то действие. This can get you started. Поскольку каждый основной файл PNG-файла называется Layer 0, это должно работать для каждого файла. Запишите действие, в котором вы устанавливаете стиль слоя Layer 0, чтобы он был окрашен в черный цвет. Затем сохраните файл и прекратите запись действия. Используйте File >> Automate >> Batch, чтобы выполнить это во многих файлах. Я бы рекомендовал сохранить резервную копию файлов, если вы допустили ошибку.

+0

Это был бы отличный способ создать файл .png для каждого изображения, которое я намеревался сделать для этого. Спасибо за ссылку! Однако, если у меня есть непомерно большое количество этих изображений, их упаковка в проекте java приведет к большому размеру файла. Будет ли способ сделать это с помощью Java-операции? –