<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Преобразование палитры средствами Pillow.</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10243.html</link>
    <description>Нужно склеить 2 изображения с разными палитрами. (Одно требуется сохранить без изменений, в другом изменения допустимы.) Поступил просто: создал 3-е изображение нужного размера с палитрой от 1-го, Image.paste()-ом вставил туда 1-е и 2-е. В результате во 2-ом часть оттенков синего стала жёлтыми. Попробовал предварительно преобразовать 2-е в 24-битное &amp;#8212; синие цвета покрылись красными точками. Если перед paste() обрабатывать вставляемое convert()-ом, результат тот же (как и следует из докуентации).&lt;br&gt;&lt;br&gt;ar1 =  fromfile( f1, dtype=uint8 )&lt;br&gt;pal1 = fromfile( p1, dtype=uint8 )&lt;br&gt;pic1 = Image.frombuffer( &apos;P&apos;, (32*13, 32*3), ar1, &apos;raw&apos;, &apos;P&apos;, 0, 1 )&lt;br&gt;pic1.putpalette(pal1&#091;0:768&#093;)&lt;br&gt;&lt;br&gt;ar2 =  fromfile( f2, dtype=uint8 )&lt;br&gt;pal2 = fromfile( p2, dtype=uint8 )&lt;br&gt;pic2 = Image.frombuffer( &apos;P&apos;, (32*13, 32*3), ar2, &apos;raw&apos;, &apos;P&apos;, 0, 1 )&lt;br&gt;pic2.putpalette(pal2&#091;0:768&#093;)&lt;br&gt;pic2.show()&lt;br&gt;#pict = pic2.convert( mode=&apos;RGB&apos; )&lt;br&gt;#pic3 = pict.convert( mode=&apos;P&apos;, palette=pic1.getpalette() )&lt;br&gt;&lt;br&gt;picc = Image.new( &apos;P&apos;, (32*13*2, 32*3) )&lt;br&gt;picc.putpalett</description>

<item>
    <title>Преобразование палитры средствами Pillow. (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10243.html#1</link>
    <pubDate>Sun, 07 Oct 2018 16:34:49 GMT</pubDate>
    <description>Разобрался сам:&lt;br&gt;&lt;br&gt;1. При paste() из индексированного в индексированный различия палитр не учитываются. Синий стал жёлтым из-за того, что серия оттенков жёлтого в 1-ой палитре и синего во 2-ой имели одинаковые индексы.&lt;br&gt;2. При paste() из RGB в индексированный для вставляемого вызывается convert(), который в свою очередь вызывает quantize() с какой-то своей палитрой. Отсюда красные пятна на месте некоторых оттенков синего.&lt;br&gt;3. Чтобы преобразовать индексированную картинку к другой палитре, нужно сперва вызвать convert( mode=&apos;RGB&apos; ), затем quantize() с требуемой палитрой.&lt;br&gt;4. Если нет подходящих цветов, quantize() добавит регулярную сетку пикселей для получения в среднем нужного цвета. Полезно на больших разрешениях, вредно на малых &amp;#8212; в моём случае.&lt;br&gt;5. Чтобы этого избежать, можно заменить цвета во 2-ой палитре близкими цветами из 1-ой.&lt;br&gt;6. Правильный вариант скрипта: https://www.linux.org.ru/forum/development/14517401?cid=14518562 Буду рад советам, как его ускорить.&lt;br&gt;</description>
</item>

</channel>
</rss>
