LINUX.ORG.RU

Поиски программы по уменьшению глубины цвета изображения

 ,


0

1

Вода

В 2001 году Камелоты(Camelot Software Planning) выпустили РПГ «Golden Sun» для портативки Game Boy Advance. Графика лютая, у игры была своя фанбаза, но за всё время существования игры полный спрайтшит никто не вытащил(даже из сиквела The Lost Age). В чём лютость графики? В том, что у Камелотов сильно намешанная палитра на спрайтах. Когда смотришь на это через апскейлер или графический редактор, можно даже заметить несовпадающие цвета(тёмно-зелёные, иногда красные и жёлтые пиксели) там, где их быть не должно. Если посмотреть на «синдикате» и открыть любой каст псинергии(например Извержение), то огоньки в нём какие-то нечёткие, не пропорционально квадратные. Как я понимаю, тут было большое изображение, позже сжатое до разрешения 240*160. Прикол в том, что это работает, создаёт немного эффекта 3D, и главное - это красиво.

На какое место ставить пиксели не того цвета я сам не разберусь, поэтому хочу тоже прибегнуть к «читерству» и брать картинки с большой палитрой(True или High Color), а затем убирать у них глубину цвета. Программа сама вставит тот цвет, который надо, а потом можно будет смотреть на идеал. Что-то наподобие выбора глубины дисплея в Windows между True Color, High Color, 256, и 16 цветами, только для изображений, а не для всего дисплея. Вижу пока irfanview, но она виндовсовая. В приоритете у меня именно то, что идёт под Linux. Если иначе никак, прибегну к Wine.

Кратко

Было изображение в True Color. Мы загрузили его в «програмку», через неё ужали глубину цвета до 256 Colors. Стало не красиво, зато убрались лишние цвета и можно дальше манипулировать результатом в каком-нибудь Aseprite.

Надеюсь я всё понятно объяснил. Подскажите плиз 🙏

P.S: Может быть я путаю понятия «Глубина цвета» и «Цветовые каналы». Идея в том, чтобы было что-то подобное, как на этом фото



Последнее исправление: Tyse_EX (всего исправлений: 3)

Практически любой графический редактор это умеет (всякие паинты). Просто при сохранении выбираешь формат цветов. Я удивлён как ты умудрился усмотреть тут проблему.

Проблема тут в другом: с помощью уменьшения битности цвета ты никакого улучшеного качества не получишь. Вообще непонятна твоя логика.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Tyse_EX

А тут ещё вопрос, надо экспортировать прям с заданной глубиной или как TrueColor, но с цветами глубина которых ниже =)

Просто есть разница в том нужна лишь стилизация, или смена формата изображения.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

или как TrueColor, но с цветами глубина которых ниже

True Color тянет до 65536 цветов. Вы имеете ввиду сжать цвета до условных 256, но экспортировать как True Color? Без разницы. Главное, чтобы в результате было «упрощённое» изображение

Tyse_EX
() автор топика
Последнее исправление: Tyse_EX (всего исправлений: 1)
Ответ на: комментарий от Tyse_EX

Набросал на коленке, может такое надо это стилизация под низкую битность, а не настоящее преобразование.
Прост чёт стало интересно и захотелось.

Пример, слева изначальное, справа стилизация цвета.

Установить love2d

  • apt install love

Скопировать код в файл main.lua

function love.filedropped(file)
    filename = file:getFilename()
    ext = filename:match("%.%w+$")

    if ext == ".png" then
        file:open("r")
        fileData = file:read("data")
        data = love.image.newImageData(fileData)
        img  = love.graphics.newImage(data)
    end

    sx,sy = img:getDimensions()
    wx,wy = love.window.getMode()
    px = (wx / 2) - (sx / 2)
    py = (wy / 2) - (sy / 2)
    depth = 4
end


function love.mousemoved(x,y,dx,dy)
    if love.mouse.isDown(1) and px and py then
       px = px + dx
       py = py + dy
    end
end

function step(channel,bit)
     channel = channel * 255
     local step = 255 / bit
     return (math.floor(channel / step) * step + (step - 1))  / 255
end

function love.keypressed(key)

    if key == 's' then
       data:encode("png","out.png")
       love.system.openURL(love.filesystem.getSaveDirectory())
       return
    end
    if key == 'up' or key == 'down' then
    data = love.image.newImageData(fileData)
        depth = key == 'up' and depth + 1 or depth
        depth = key == 'down' and depth - 1 or depth
        if img then
           for y = 1, sy do
              for x = 1, sx do
                 local r, g, b, a = data:getPixel(x-1, y-1);
                 r = step(r,depth)
                 g = step(g,depth)
                 b = step(b,depth)
                 data:setPixel( x-1, y-1, r, g, b, a );
              end
           end
        end
    end
    img  = love.graphics.newImage(data)
end

function love.draw()
    if img then
       love.graphics.print("Use KEYUP and KEYDOWN for change imege Depth Color ["..255/(255/depth)..']');
       love.graphics.draw(img,px,py)
    else
       love.graphics.print("Drop PNG Image");
    end
end

Открыть терминал в каталоге где лежит main.lua и выполнить

love .
  • В открывшееся окно можно перетащить png картинку
  • Далее можно нажимать стрелочки вверх/вниз на клавиатуре
    • оно шакалит цвета по принципу ступенчатных прыжков по диапазону 0-255 чем ниже ступень в виде коффиэциэнта деления, тем больше прыжки. Это чисто симуляция и стилизация, TrueColor под низкую битность отдельных каналов цветов.

На кнопку s откроется каталог с преобразованной картинкой out.png

Или можно просто скачать

И запустить imagedeep.love программой love

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

Может пригодится, а может нет.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)