LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

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

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

Установить 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, :

Набросал на коленке, может такое надо

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

Установить 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

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

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