Как преобразовать 32-битный PNG в RGB565?

Как я могу сделать это? Программное решение (Objective-c) великолепно, но даже не прогарматическое - хорошо.

У меня есть пиксельматор - & gt; Но это не дает вам выбора. Я также не могу сделать это с помощью Preview.

Я пробовал поискать в Google, но пока не смог найти решения. Единственный инструмент, который я смог использовать для этого, - это TexturePacker, но он создает лист спрайта.

 Pterie Daktyl13 апр. 2012 г., 05:01
Если вы используете упаковщик текстур,texturepacker.com , инструмент позволяет указать формат пикселя (RGB565). Если указать его как RGB565, спрайт-лист будет намного меньше, чем если бы вы указали RGB8888. Я пытаюсь сделать то же самое для отдельных изображений без использования инструмента упаковщика текстур.
 Pterie Daktyl14 апр. 2012 г., 10:40
Спрайт лист является PNG. Я не знаю, как работает сжатие, или очень много о формате png. Я нашел решение. Смотрите мой ответ, если вас интересует упаковщик текстур или это решение. Благодарю.
 leonbloy12 апр. 2012 г., 14:05
Вы смешиваете яблоки и апельсины. PNG - это формат архива для изображений, RGB565 - это представление необработанных изображений в памяти. Пожалуйста, объясните, что вы пытаетесь сделать.
 leonbloy13 апр. 2012 г., 18:43
& Quot; лист спрайтов намного меньше & quot; ... что это? сохраненный PNG? PNG не может упаковать значения RGB как RGB565. Если вы преобразуете (в памяти) изображение в RGB565 и сохраняете его в формате PNG, оно будет сохранено либо в виде палитры, либо в виде RGB8 - что было бы примерно эквивалентно постеризации на исходном изображении.

Ответы на вопрос(5)

Решение Вопроса

you can do it from command line - see

http://www.texturepacker.com/uncategorized/batch-converting-images-to-pvr-or-pvr-ccz/

Just adjust the opt and set output to .png instead of pvr.ccz
Make sure that you do not overwrite your source images.

posterize к изображению (программно или с помощью ImageMagick или с любым графическим редактором), что означает отбрасывание младших значащих битов в каждом канале. При сохранении в PNG вы все равно будете сохранять 8 бит на канал (если не используете палитру), но даже в этом случае вы получите заметное уменьшение размера из-за сжатия PNG.

Быстрый пример: original:

enter image description here

после простой постеризации с 32 уровнями (эквивалентными RGB555) с применением XnView

enter image description here

Размер от 89КБ до 47КБ, с небольшой потерей качества. В случае синтетических изображений с градиентами потеря качества может быть гораздо более заметной (полосатость).

 09 июл. 2014 г., 01:53
Есть ли шанс, что кто-то может предоставить команду ImageMagick для реализации того, что говорится в этом посте?
 09 июл. 2014 г., 02:14
Увидеть-posterize а также-color

Согласно Википедии, которая всегда права, единственный 16-битный PNG - это PNG в оттенках серого.http://en.wikipedia.org/wiki/Portable_Network_Graphics

Если вы просто добавите 32-битный (альфа) или 24-битный (без альфа) PNG в свой проект как обычно, а затем установите формат текстуры в Cocos2D, все будет хорошо. Код для этого:

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565];
 13 апр. 2012 г., 19:29
Хмм хорошо. Я не знал, что вы могли бы сделать это, но я обнаружил, что, очевидно, Paint.NET может это сделать.forums.getpaint.net/index.php?/topic/…
 Pterie Daktyl13 апр. 2012 г., 04:58
Спасибо, Даняль. Я понимаю, как изменить формат текстуры в cocos2d, но я пытался изменить сами файлы, чтобы сэкономить место. Когда я использовал упаковщик текстур, листы спрайтов были намного меньше, когда я сохранял их как RGB565. Поскольку теперь мне нужно уменьшить отдельные изображения, мне было интересно, есть ли способ сделать это, кроме упаковщика текстур.
 12 апр. 2012 г., 18:04
Есть также 1, 2, 4, 8 и 64-битные PNG :) А также PNG с палитрой.

Ты можешь использоватьLibpng преобразовать изображение PNG в трехбайтовый (8: 8: 8) RGB. Затем вы можете уменьшить до 5: 6: 5 16-битных значений цвета RGB565. Еслиr, g, а такжеb это соответствующие 8-битные цвета (хранящиеся в типе без знака), тогда 16-битное значение RGB565 равно:

((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)

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

 Pterie Daktyl13 апр. 2012 г., 05:02
Спасибо Марк. Я не знаю, как сделать эту понижающую выборку :). Отсюда и мой вопрос. Я предполагаю, что кто-то еще, должно быть, уже сделал это, поэтому я просто ищу программный способ или инструмент. Я не хочу кататься самостоятельно.

используя Quartz, нарисуйте свой PNG в этом контексте, сохраните этот растровый контекст в файл.

Ваш ответ на вопрос