LINUX.ORG.RU

Gimp конверсия в индексированное

 ,


0

2

Подскажите есть ли плагин какой, который позволяет настраивать глубину дизеринга при конверсии в индексированное изображение в гимпе? Стандартная конверсия это лютый пиндец.



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

глубину дизеринга

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

лютый п*здец

аккуратнее с выражениями, молодой человек

anonymous
()

Человеческая вера во всесилие плагинов неистребима.

глубину дизеринга

Это что вообще такое?

Стандартная конверсия это лютый пиздец.

А ничего, что у тебя три режима на выбор при выключенном дитеринге по умолчанию?

AP ★★★★★
()
Ответ на: комментарий от anonymous

Я знаю, что такое подмешивание шума — и в графике, и в аудио. Я не понимаю смысл фразы «_глубина_ подмешивания шума».

AP ★★★★★
()
Ответ на: комментарий от anonymous

Хм. Попробую выразиться попонятнее. В алгоритме преобразования, который используется в гимпе, нельзя настроить растекание цветов. Т.е. изображение получается сильно точечное. Конечно на больших картиках это не заметно, но мне нужно картинки размером 320*200, причем ещё и в своей палитре.

В фотошопе при преобразовании в индексированное есть возможность настроить этот параметр. Начиная от плоских цветов (аналогично без дезиренга в гимпе), заканчивая полным дезиренгом.

Сделал бы всё там, но там другая проблема - изображение перед переводом в indexed надо преобразовать в однослойное.

А так же нельзя применять фильтры коррекции к конкретному слою.

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

есть возможность настроить

gimp-gmic поковыряй, там должно быть что-то близкое к тому, что ты описываешь.

anonymous
()
Ответ на: комментарий от anonymous

gimp-gmic поковыряй, там должно быть что-то близкое к тому, что ты описываешь.

Там есть фильтр colormap, но не подходит мне. Нельзя загрузить свою палитру, а встроенные возможности только до 8 цветов.

Или может я не нашёл.

Demige
() автор топика
Ответ на: комментарий от anonymous

Постеризация не предусматривает использование конкретной палитры. Поэтому не помогает, а наоборот.

Попробовал pixel-art-maker - результаты хорошие, но вот хотелось бы всё это в гимпе и со слоями.

-- Неправильно выразился. Результат офигенный.

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

ага, понятно. тут, возможно, выставляется порог ошибки, если она меньше какого-то значения на каком-то количестве пикселов, то она аннулируется. возможно.

есть оригинал картинки на попробовать?

anonymous
()
Ответ на: комментарий от anonymous

Вот:

https://c.radikal.ru/c26/1910/22/6a1814939580.png

палитры 64 общая и 16 конкретно для этой сцены. https://d.radikal.ru/d14/1910/3b/d3df6191f0c3.png

https://d.radikal.ru/d07/1910/2d/3ee5a3bcfc36.png

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

но вот хотелось бы всё это в гимпе и со слоями

Для этого надо переписать на гегле ту часть конвертера в индексированное, которая использует дитеринг. Тогда у тебя будет существенно бОльший выбор алгоритмов, включая байерову матрицу, которая видна в примерах на https://github.com/ImageProcessing-ElectronicPublications/pixel-art-maker. Собственно, можешь заценить их применением дитеринга как отдельного фильтра (Colors > Dithering).

AP ★★★★★
()
Ответ на: комментарий от Demige

спасибо.

вот это лучшее, что у меня вышло в редакторе mtpaint: https://i.imgur.com/T4i5NKS.png параметр там называется «error propagation», увидишь, если нажмёшь на кнопку settings в диалоге convert to indexed...

к сожалению, в отрыве от гимпа и, опять же, без слоёв.

anonymous
()
Ответ на: комментарий от Demige

Да результат отличный

То, что Вам нужно, делает pnmremap из netpbm. Ищите плугин, связанный с netpbm, мож повезёт.

anonymous
()
Ответ на: комментарий от anonymous

Опа, mtpaint использует netpbm? Не знал.

AP ★★★★★
()
Ответ на: комментарий от anonymous

То, что Вам нужно, делает pnmremap из netpbm. Ищите плугин, связанный с netpbm, мож повезёт.

Нашел netpbm для gimp.

Но вот смотрю мануал на pnmremap, в нём нет настройки «error propagation».

Demige
() автор топика
Ответ на: комментарий от Demige

нашёл в imagemagick такую же опцию, присутствует, начиная с 6 версии. вот плугин для гимпа: https://pastebin.com/qjerTiQg — берёт текущую активную палитру и с помощью неё делает «индексированный» слой (на самом деле rgb).

сам там допилишь, если чего не так :) работать будет только в линупсах и только если у тебя есть имиджмаджик 6+.

вот тут отличный (почти) пример оформления плугинов: https://github.com/sjgcit/gimp-imagemagick/blob/master/mm_tool_imagemagick.py

будет, наверное, неплохо добавить галочку «оставлять временный файл» (который, кстати, индексированный, а не rgb) или вовсе сделать диалог сохранения. спрашивай, если что, подскажу.

AP, а где можно человеческую документацию по gimpfu посмотреть? у меня что-то все гуглы сломались.

anonymous
()
Ответ на: комментарий от anonymous

Тут бегунок ни на что не влияет. Наверно у меня imagemagic это не поддерживает. Хотя версия 6.9.7-4

Погуглил - это баг имеджмагика, надо качать последнюю версию.

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

надо качать последнюю версию

mm_tool_imagemagick.py 	Bug fix and developer email corrected 	4 years ago

4 года прошло, Карл!

anonymous
()
Ответ на: комментарий от anonymous

Последнюю скомпилил. Работает. Вставил ещё в плагин поле с выбором количества цветов из активной палитры.

#!/usr/bin/python
from gimpfu import *
import tempfile, subprocess, os

def plugin_main(timg, tdrawable, amount,colors):
    sfx = '.png'
    pfx = 'gimp_convert_to_paletted_plugin'
    tmpifn = tempfile.mktemp(sfx, pfx)
    tmpofn = tempfile.mktemp(sfx, pfx)
    tmppfn = tempfile.mktemp(sfx, pfx)

    pal = pdb.gimp_context_get_palette()
    num_colors, colors = pdb.gimp_palette_get_colors(pal)

    tempimage = pdb.gimp_image_duplicate(timg)
    tempdrawable = pdb.gimp_layer_new_from_visible(tempimage, tempimage, "visible")
    pdb.gimp_file_save(tempimage, tempdrawable, tmpifn, "")
    pdb.gimp_image_delete(tempimage)

    tempimage = pdb.gimp_image_new(num_colors, 1, 0)
    tempdrawable = pdb.gimp_layer_new(tempimage, num_colors, 1, 1, "pal", 100, 0)
    for x,c in zip(xrange(num_colors), colors):
        pdb.gimp_drawable_set_pixel(tempdrawable, x, 0, 4, c)
    pdb.gimp_file_save(tempimage, tempdrawable, tmppfn, "")
    pdb.gimp_image_delete(tempimage)
    colors=16

    cmd = 'convert %s -dither floyd-steinberg -define dither:diffusion-amount=%i%% -remap %s -colors %i %s' % \
          (tmpifn, amount, tmppfn, colors, tmpofn)

    p = subprocess.Popen(cmd.split(), shell=False)
    p.communicate()

    layer = pdb.gimp_file_load_layer(timg, tmpofn)
    pdb.gimp_image_insert_layer(timg, layer, None, -1)

    for fn in [tmpifn, tmpofn, tmppfn]:
        os.remove(fn)

register(
        "python_fu_convert_to_paletted",
        "Convert to paletted",
        "Convert to paletted",
        "Anonymous",
        "Anonymous",
        "2019",
        "<Image>/Image/Convert to paletted...",
        "RGB*",
        [(PF_SLIDER, "diffusion_amount",  "Diffusion Amount, %:", 50, [0, 100, 1]),
        (PF_INT, "colors", "Colors count", "16")],
        [],
        plugin_main)

Таким способом можно кстати и pixel-art в плугин засовать.

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

colors

тока имя параметра поменяй, а то он маскируется локальной переменной в строке num_colors, colors = pdb.gimp_palette_get_colors(pal)

anonymous
()
Ответ на: комментарий от Demige

патч к оригиналу

@@ -6 +6 @@
-def plugin_main(timg, tdrawable, amount):
+def plugin_main(timg, tdrawable, amount, num_colors):
@@ -14 +14 @@
-    num_colors, colors = pdb.gimp_palette_get_colors(pal)
+    _, colors = pdb.gimp_palette_get_colors(pal)
@@ -49 +49,4 @@
-        [(PF_SLIDER, "diffusion_amount",  "Diffusion Amount, %:", 50, [0, 100, 1])],
+        [
+            (PF_SLIDER, "diffusion_amount",  "Diffusion Amount, %:", 50, [0, 100, 1]),
+            (PF_INT, "colors", "Colors count", "16")
+        ],

но, по-хоршему, надо какой-то спинбокс сделать, с ограничением как в большую сторону, так и в меньшую, а то, получается и 0 можно, и 9000. оно, конечно, ничего страшного, но некрасиво.

anonymous
()
Ответ на: комментарий от Demige

это, я так понял, из-за порядка сканирования. в mtpaint его можно поменять со змейки на последовательный построчный, а в im только змейка, отсюда и «полоски» на руке.

ещё в mtpaint заодно можно выбрать цветовое пространство, в котором будут сравниваться цвета и, например, с нелинейным srgb, картинка в общем получается чуть темнее. в гимпе можно покрутить black level в exposure перед преобразованием, для примерно того же эффекта.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.