Как стать автором
Обновить

Комментарии 42

>Это нестандартное использование «плоского» ассемблера показывает…

Вполне стандартное использование. В какой-то книжке Вирта форматы файлов RBNF описываются, и FASM создавался в похожей парадигме. Европейская школа программирования.
Спасибо за замечание. Но думаю, что многие разработчики не берут во внимание возможность использовать FASM в такой роли, поэтому я надеюсь вы не против, если я оставлю такую формулировку.
Да, естественно. Вы автор, вам и решать.
Про ХР Вы зря так… Пользоваться будут ещё лет.., ну десять, как минимум.
Сильно зависит от страны. В Китае — может быть. Там и IE6 до сих пор пользуются. Если брать только рунет, то ситуация достаточно прозрачна:

Если исключить домашние и личные компьютеры, картинка немного другая получится. Так что если у вас утилита для использования в рабочем процессе, стоит всё же подумать о поддержке.
Верно, именно поэтому на графике у Windows XP и Windows 7 сейчас (начало января) «провал», а Windows 8 осталась на месте (потому что её в основном дома используют).

В моём случае программа изначально не поддерживала Windows XP из-за использования WASAPI. И она как раз для домашнего использования :)
Нечего вам делать
Считайте, что это был вызов. Разве не интересно иногда сделать что-то не совсем типичное?
Кто в наши дни считает байты?
Сами себе создали проблему на ровном месте и сами ее героически решили.
А создавать PNG встроенные в ICO, кстати, позволяет редактор иконок ArtIcons.
Кто в наши дни считает байты?
Девиз «и так сойдёт!» — это не ко мне. Я в прошлом году написал пару программ под Dendy — вот уж где байты считал. Здесь же я даже особо и не усердствовал. Секции в исполняемом файле не объединял, необязательные ресурсы не удалял, выравнивание не уменьшал. А иконку было просто интересно сделать компактной, чтобы она весила хотя бы меньше самой программы.

Я знаю, что «экономить байты» сейчас не в тренде. Встречал логотип на сайте объёмом 2 мегабайта (кто-то поленился уменьшить размер картинки), иконки разделов примерно такого же объёма каждая (потому что генерировать маленькие картинки лень). Даже некоторые авторы статей на Хабре иногда вставляют в статьи фотографии в огромном разрешении или вообще в PNG, из-за чего они весят по несколько мегабайт каждая и долго загружаются. Я считаю это халтурой и неприемлемым. Хорошо, что тут это случается нечасто.

А создавать PNG встроенные в ICO, кстати, позволяет редактор иконок ArtIcons.
Платная. А позволяет ли она оптимизировать PNG внешними утилитами? Это было ключевым требованием. Не каждый кодер PNG даёт хороший результат. Предпочитаю использовать для этих целей инструменты, которые зарекомендовали себя в этом.
Есть мнение, что лучше чем CQ заоптимизоровать png прямо в иконке не сумеет ни один другой инструмент.

Это было «про-», а вот «контра-»: придется столкнуться с неинтуитивным интерфейсом, в котором главное — понять, что CQ лишь оптимизирует внутренние ресурсы иконке, но не позволяет собрать её с нуля и не позволяет добавить какие-либо форматы внутри; всё это нужно предварительно сделать какой-то внешней утилитой.
Даже некоторые авторы статей на Хабре...

Я тоже всегда удивляюсь, когда на хабре вижу подобное. Если большие картинки можно списать на задел под ретину, то неверный выбор формата я не знаю на что списывать. Видеть графики, текст, клипарт и прочее подобное, пожатое JPEG-ом… или когда JPEG перезаписывают в PNG… Скорее всего, это лень, воткнул первое, что попало под руку — и так сойдет.

Что касается оптимизации ICO, это возможно силами CQ. Процесс не интуитивный, да и сама возможность не очевидна, но это возможно. Собрать иконку не выйдет, можно лишь оптимизировать имеющийся в наличии файл. При открытии файла ICO появится дополнительное окно со списком, где будут все потроха:
image
Автоматически выбирается изображение с наибольшим разрешением, а чекбоксы выставляются на изображениях с максимальной глубиной цвета. Если не закрывать это окно, можно выполнить нужные манипуляции с каждым изображением, после нажатия кнопки записи (дискета на панели инструментов), поменяется статус (закрашенная звездочка), после чего в этом окне можно нажать на кнопку сохранения иконки.
image
Ваш способ более универсальный. Я лишь рассказал о возможностях инструмента, который вы уже используете.

P.S. Судя по скрину в статье, у вас старая версия CQ. В текущей версии значительно доработан алгоритм квантования и добавилось несколько полезных мелочей.
Что касается оптимизации ICO, это возможно силами CQ
Вот это неожиданность! Спасибо, в будущем буду пользоваться и этой возможностью.

Кстати, если вдруг вы надумаете сделать возможность добавления/удаления изображений в ico файл, лучше добавить возможность и изменения порядка изображений. Я сталкивался с тем, что если все изображения в иконке в формате PNG, и расположены они по возрастанию, система почему-то иногда ошибочно выбирала самую маленькую версию вместо подходящей. При обратном же порядке — всегда выбиралась именно подходящая версия.

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

P.S. Судя по скрину в статье, у вас старая версия CQ. В текущей версии значительно доработан алгоритм квантования и добавилось несколько полезных мелочей.
Угу, я и сам заметил, что несколько месяцев назад вышла новая версия программы, но только уже после публикации статьи :)
к сожалению, я не нашёл какого-то открытого баг-трекера
Microsoft Connect
Спасибо, но насколько я вижу, там нет баг-трекера для самой Windows.
А вы думали, так легко сообщить в MS об ошибке? Уж давно там все так огорожено, что не подступишься. Зачастую сетования на тему «у вас что-то не работает» оказывались ошибками самого программиста — либо использование недокументированного чего-либо, либо просто неправильное использование, баги в самих программах. Теперь надо прорваться через комьюнити, форумы и пр. Две ошибки — в API и одну в OLE интерфейсе одного их объекта мне так и не удалось отрепортить, как ни пытался. Обещания «мы с вами свяжемся дл уточнения» пока не исполнялись.
А покупать платную поддержку чтобы им же их же баги сообщать неохота.
[шутка] Видимо, в Microsoft считают, что в Windows ошибок быть не может. :-) [/шутка]

Можно попробовать использовать некое приложение «Feedback app», доступное для Windows 10 Technical Preview в рамках программы «Windows Insider Program». Кроме того, заявляется, что на официальных форумах сообщества можно получить комментарии в том числе от технических специалистов Microsoft:
And check out the Technical Preview forum. This is a vibrant community where you can interact with Microsoft engineers and fellow Insiders.
Форумов там мильон, сложно определить тему с сообщением об ошибке в нужный раздел, да и комментарии специалистов встречаются не так часто.
По поводу feedback для новой системы тоже имел опыт, через Connect, правда, а не специальное приложение: отрепортил во времена релиза 8 ошибку. Потом, спустя какое-то время, добавил, что поисследовал другие версии, и увидел что та же ошибка есть и в 7 и в XP (т.е. ошибка старая, но само место малоиспользуемое).
Как вы думаете, какая была реакция? «Извините, но мы собираем ошибки касающиеся ТОЛЬКО 8ки, а так как ваша ошибка есть и в других версиях, то она не 8 specific, поэтому мы закрываем ваш багрепорт». Как и куда теперь им стучать — ни слова.
рограмма — 14КБ, иконка 16×16 + 32×32 + 48×48 пикселей — 15КБ. Какое расточительство! :) К счастью оказалось, что Windows (начиная с Vista) поддерживает PNG внутри ICO. Это как раз то, что нужно!


Я конечно понимаю, что оптимизация — это здорово. Но чем Вас не устраивает 29КБ exe-шник? 21 век на дворе — 640 КБ на всех уже давно не хватает…
Ну у меня случился разрыв шаблона от понимания, что иконка программы весит больше, чем сама программа. Это как если бы на обложке книги было бы больше информации, чем в самой книге.

Если бы там было бы всё сложно, я бы конечно не стал разбираться и тратить на это время, порядок объёмов всё же не такой большой. Но когда я краем глаза посмотрел спецификацию и увидел, как там всё просто — уже не смог устоять. Вызов был принят автоматически :)
В таком случае, я с трудом представляю что у Вас за программы такие…
Я сам пишу на Си под микроконтроллеры. Так даже у меня шестнадцатеричный файл прошивки для 8-битного микроконтроллера весит 8-20КБ :)
На C++ я ничего большого не пишу. В Sound Keeper ≈850 строк кода. Для чего-то большого на десктопе я использую C#, а для веба использую вообще неправославный PHP :)
Так это нормально ведь, что ресурсы занимают больше места чем код. Звук СЕЕЕ-ГАААА при старте игры Sonic The Hedgehog 1/8 всего места на картридже занимает, и ничего. Раньше вы могли гордиться тем, что у вас программа меньше чем ее иконка, а теперь — нет :)
Ну и почему бы тогда вообще все на FASM не писать. Только на ассемблере можно вписываться в невозможные ограничения. Напишите программу, которая при первом запуске сама себе процедурно генерирует красивую иконку.
Так это нормально ведь, что ресурсы занимают больше места чем код.
Есть разница между просто программой и игрушкой. Плюс к этому, если есть возможность сжать ресурсы, но это не сделано — это халтура.
Звук СЕЕЕ-ГАААА при старте игры Sonic The Hedgehog 1/8 всего места на картридже занимает, и ничего.
Тут проблема явно была в том, что процессор Сеги не потянул бы в реальном времени декодирование чего-то серьёзного вроде MP3. По возможности и там ресурсы сжимались. На NES в играх даже строки иногда были упакованы каким-нибудь простым алгоритмом. Я, конечно, не призываю к такому драматизму, просто пример.
Ну и почему бы тогда вообще все на FASM не писать.
Ну если хотите таких крайностей — никто не запрещает вам писать всё на ассемблере. Есть разница между небольшими оптимизациями, которые не требуют много времени на реализацию, и между теми оптимизациями, которые требуют чрезвычайных усилий при минимальном выхлопе.
Я взял огромные куски кода с MSDN, где активно используется COM/WASAPI, и переделал их под свою задачу. Вы представляете, сколько бы времени у меня занял перенос этого на ассемблер? Возможно даже заголовочные файлы WASAPI с необходимыми структурами самому пришлось бы полностью описывать.
При помощи FASM я решаю другие задачи, которые удобнее всего решаются именно им. Например, он очень полезен при патчинге других приложений. Оказалось, что для сборки нужной мне иконки он также годится лучше всего :)
Напишите программу, которая при первом запуске сама себе процедурно генерирует красивую иконку.
Проводник не сможет отобразить такую иконку.
Ну у меня случился разрыв шаблона от понимания, что иконка программы весит больше, чем сама программа.

Я как-то раз тоже дурью маялся. Мне нужно было подружить RunDll с ComCtl v6. Так вот у меня XML-ный манифест занимал больше места, чем программа, и вообще файл получился состоящим из паддингов.
А ведь в электронном оригинал-макете книги обложка «весит» гораздо больше, чем сам текст :)
Шикарно, спасибо. FASM хорош.
НЛО прилетело и опубликовало эту надпись здесь
Сдвиг и какой-то мусор слева в маске как раз может быть вызван тем, что там ведётся некорректная работа с буфером. Если кто-то сможет расковырять этот баг и уронить с его помощью стандартную функцию декодирования — это просто замечательно. В таком случае быстрее исправят. Мало ведь кому понравится, что иконка может уронить Explorer.
Что творят люди, помнится я предложил чтоб защитить файл ресурсов от извлечения из программы, положить его не папку с файлами, а инкапсулировать в бинарник ввиде char []. Так на до мной смеялись, а тут такое — как к такому отнесся коллектив?
помнится я предложил чтоб защитить файл ресурсов от извлечения из программы, положить его не папку с файлами, а инкапсулировать в бинарник ввиде char []
И в чём будет проблема найти этот массив по какому-то смещению и скопировать напрямую из бинарника?
а тут такое — как к такому отнесся коллектив?
Мелкие утилитки пишут обычно в одиночку. И на самом деле такой подход мне кажется более удобным. Раньше я сохранял каждый нужный размер иконки в PNG32 в полноценном графическом редакторе, затем по одному файлику вручную импортировал их в иконку при помощи бесплатной версии IcoFX. Сейчас же для того, чтобы собрать иконку из пачки PNG файлов, достаточно просто запустить один батник, подправив немного asm файл, если вдруг поменялся набор размеров (что бывает нечасто). Можно в принципе и написать небольшую программу, которая бы автоматически собирала из пачки PNG файлов иконку. Но вариант с FASM мне показался проще и быстрее. При желании можно и конвертацию в PNG8 тоже автоматизировать при помощи консольной truepng :) Есть правда вероятность, что может возникнуть описанная выше проблема с неправильной маской. Вот бы MS исправила эту проблему, вообще хорошо стало бы!
>>>И в чём будет проблема найти этот массив по какому-то смещению и скопировать напрямую из бинарника?

В какую очередь вы будете искать ресурсы в самом бинарнике? По моему это по надежнее чем то что выбрали — запаковать файл архиватором и стереть у архива сигнатуру.
Сигнатуру в смысле заголовок? Ну да, можно, только анализ энтропии файла покажет, что в определенном месте лежат пожатые данные, а дальше уже дело техники понять, как они были упакованы.
Но можете попробовать сделать то, что предлагаете, а потом скормить свою программу, например, binwalk
Ну да, заголовок — первые несколько байт файла. Должно распаковываться без проблем утилитами специализирующимися на «битых» архивах.
Чем можно провести такой анализ?
Я же говорил, например, binwalk.
Он и энтропию посчитает и популярные форматы найдет внутри файла, даже распаковать может
Понятно, просто мне показалось почему-то, что последнее предложение не связано со вторым. Спасибо.
Смотря какие ресурсы. Уж картинки-то точно в первую очередь в секции ресурсов размещают. Как и курсоры, как и бинарные файлы.
НЛО прилетело и опубликовало эту надпись здесь
enddialog — это макрос, а не языковая конструкция. Там большая часть встроенных фишек реализована на макросах. И самому можно тоже мощные макросы писать.
Это всё делает же convert из пакета IMagick
(Его так же можно попросить завернуть в ico заранее подготовленные png)

convert icon.png -bordercolor white -border 0 \
          \( -clone 0 -resize 48x48 -colors 256 \) \
          \( -clone 0 -resize 32x32 -colors 256 \) \
          \( -clone 0 -resize 16x16 -colors 256 \) \
          \( -clone 0 -resize 256x256 -colors 256 \) \
          \( -clone 0 -resize 48x48 \) \
          \( -clone 0 -resize 32x32 \) \
          \( -clone 0 -resize 24x24 \) \
          \( -clone 0 -resize 16x16 \) \
          icon.ico
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории