Если картинка стоит 1000 слов, сколько из картинки вы можете уместить в 140 символов?
Примечание : вот и все, ребята! Крайний срок получения щедрости здесь, и после некоторого трудного обсуждения я решил, что вступление Боджума едва ли вытеснило вступление Сэма Хочевара . Я опубликую более подробные заметки, как только у меня будет возможность написать их. Конечно, каждый может свободно представлять свои решения и улучшать решения, чтобы люди могли голосовать за них. Спасибо всем, кто представил и запись; Я наслаждался всеми ими. Мне было очень весело бегать, и я надеюсь, что это было весело и для участников, и для зрителей.
Я наткнулся на этот интересный пост о попытке сжать изображения в комментарии в Твиттере, и у многих людей в этой теме (и в теме Reddit ) были предложения о том, как можно это сделать. Итак, я полагаю, что это было бы хорошим испытанием для кодирования; пусть люди вкладывают свои деньги туда, где они говорят, и покажут, как их идеи о кодировании могут привести к более подробной информации в ограниченном пространстве, которое у вас есть.
Я призываю вас придумать систему общего назначения для кодирования изображений в сообщения Twitter из 140 символов и их повторного декодирования в изображение. Вы можете использовать символы Юникода, так что вы получите более 8 бит на символ. Однако, даже учитывая символы Юникода, вам нужно будет сжимать изображения в очень небольшое пространство; это, безусловно, будет сжатие с потерями, и поэтому должны быть субъективные суждения о том, как хорошо выглядит каждый результат.
Вот результат, который оригинальный автор, Квазимондо , получил из своей кодировки (изображение под лицензией Creative Commons Attribution-Noncommercial ):

Вы можете сделать лучше?
правила
- Ваша программа должна иметь два режима: кодирование и декодирование .
- При кодировании :
- Ваша программа должна принимать в качестве входных данных графику в любом приемлемом растровом графическом формате по вашему выбору. Мы скажем, что любой растровый формат, поддерживаемый ImageMagick, считается разумным.
- Ваша программа должна вывести сообщение, которое может быть представлено в 140 или менее кодовых точках Юникода; 140 кодовых точек в диапазоне
U+0000-U+10FFFF, без учета символов (U+FFFE,U+FFFF,U+пFFFE,U+пFFFF, где п является1-10шестнадцатеричное, а диапазонU+FDD0-U+FDEF) и суррогатной кодовые точки (U+D800-U+DFFF). Он может быть выведен в любой разумной кодировке на ваш выбор; любая кодировка, поддерживаемая GNU,iconvбудет считаться разумной, и, скорее всего, хорошим выбором будет исходная кодировка вашей платформы или кодировка локали. См. Примечания Unicode ниже для более подробной информации.
- При декодировании :
- Ваша программа должна принимать в качестве входных данных вывод вашего режима кодирования .
- Ваша программа должна выводить изображение в любом приемлемом формате по вашему выбору, как определено выше, хотя для выходных векторных форматов тоже все в порядке.
- Выходное изображение должно быть приближенным к входному изображению; чем ближе вы можете добраться до входного изображения, тем лучше.
- Процесс декодирования может не иметь доступа к какому-либо другому выходу процесса кодирования, кроме выходных данных, указанных выше; то есть вы не можете загрузить изображение куда-нибудь и вывести URL для процесса декодирования, чтобы загрузить, или что-нибудь глупое, как это.
Для согласованности в пользовательском интерфейсе ваша программа должна вести себя следующим образом:
- Ваша программа должна быть скриптом, который можно установить на исполняемый файл на платформе с соответствующим интерпретатором, или программой, которая может быть скомпилирована в исполняемый файл.
- Ваша программа должна принять в качестве первого аргумента либо
encodeлибоdecodeустановить режим. Ваша программа должна принимать данные одним или несколькими из следующих способов (если вы реализуете тот, который принимает имена файлов, вы также можете читать и писать из stdin и stdout, если имена файлов отсутствуют):
Возьмите вход от стандартного входа и произведите выход на стандартный выход.
my-program encode <input.png >output.txt my-program decode <output.txt >output.pngВозьмите ввод из файла, названного во втором аргументе, и произведите вывод в файле, названном в третьем.
my-program encode input.png output.txt my-program decode output.txt output.png
- Для вашего решения, пожалуйста, напишите:
- Ваш код полностью и / или ссылка на него размещена в другом месте (если он очень длинный или требует много файлов для компиляции или что-то в этом роде).
- Объяснение того, как это работает, если это не сразу видно из кода или если код длинный, и люди будут заинтересованы в резюме.
- Пример изображения с исходным изображением, текстом, сжимаемым до него, и декодированным изображением.
- Если вы основываетесь на идее, которая была у кого-то другого, приписывайте их. Можно попытаться усовершенствовать чужую идею, но вы должны приписать их.
Методические рекомендации
Это в основном правила, которые могут быть нарушены, предложения или критерии оценки:
- Эстетика важна. Я буду судить и предположить, что другие люди судят, основываясь на:
- Насколько хорошо выглядит выходное изображение и насколько оно похоже на оригинал.
- Как красиво выглядит текст. Полностью случайный gobbledigook - это нормально, если у вас действительно умная схема сжатия, но я также хочу увидеть ответы, которые превращают изображения в многоязычные стихи или что-то умное в этом роде. Обратите внимание, что автор оригинального решения решил использовать только китайские иероглифы, так как это выглядело лучше.
- Интересный код и умные алгоритмы всегда хороши. Мне нравится короткий, понятный и понятный код, но действительно умные сложные алгоритмы тоже подходят, если они дают хорошие результаты.
- Скорость также важна, хотя и не так важна, как хорошая работа по сжатию изображения. Я предпочел бы иметь программу, которая может конвертировать изображение за одну десятую секунды, чем что-то, что будет выполнять генетические алгоритмы целыми днями.
- Я предпочту более короткие решения более длинным, если они достаточно сопоставимы по качеству; краткость это добродетель.
- Ваша программа должна быть реализована на языке, который имеет свободно доступную реализацию в Mac OS X, Linux или Windows. Я хотел бы иметь возможность запускать программы, но если у вас есть отличное решение, которое работает только под MATLAB или что-то еще, это нормально.
- Ваша программа должна быть максимально общей; он должен работать для максимально возможного количества различных изображений, хотя некоторые могут давать лучшие результаты, чем другие. В частности:
- Наличие нескольких изображений, встроенных в программу, с которой она сопоставляет и записывает ссылку, а затем создает соответствующее изображение при декодировании, довольно неудачно и охватывает только несколько изображений.
- Программа, которая может снимать изображения простых, плоских, геометрических фигур и разлагать их на какой-то векторный примитив, довольно изящна, но если она не работает на изображениях, выходящих за рамки определенной сложности, она, вероятно, недостаточно общая.
- Программа, которая может снимать только изображения с определенным фиксированным соотношением сторон, но с ними хорошо справляется, тоже будет в порядке, но не идеальна.
- Вы можете обнаружить, что черно-белое изображение может получить больше информации в меньшем пространстве, чем цветное изображение. С другой стороны, это может ограничивать типы изображений, к которым он применим; лица выглядят хорошо в черно-белом, но абстрактные рисунки могут не так хорошо выглядеть.
- Прекрасно, если выходное изображение меньше входного, но при этом примерно в той же пропорции. Это нормально, если вам нужно увеличить изображение, чтобы сравнить его с оригиналом; важно то, как это выглядит.
- Ваша программа должна выдавать результаты, которые могут проходить через Twitter и выходить невредимыми. Это всего лишь руководство, а не правило, так как я не смог найти никакой документации по конкретному поддерживаемому набору символов, но вам, вероятно, следует избегать управляющих символов, невидимых комбинационных символов, символов личного пользования и тому подобного.
Скоринговая рубрика
В качестве общего руководства о том, как я буду оценивать решения при выборе приемлемого решения, допустим, что я, вероятно, буду оценивать решения по 25-балльной шкале (это очень грубо, и я не буду ничего оценивать напрямую, просто используя это в качестве основного ориентира):
- 15 баллов за то, насколько хорошо схема кодирования воспроизводит широкий диапазон входных изображений. Это субъективное, эстетическое суждение
- 0 означает, что он вообще не работает, каждый раз возвращает одно и то же изображение или что-то в этом роде.
- 5 означает, что он может кодировать несколько изображений, хотя декодированная версия выглядит некрасиво и может не работать вообще на более сложных изображениях
- 10 означает, что он работает с широким диапазоном изображений и создает приятные на вид изображения, которые иногда могут быть различимы
- 15 означает, что он создает идеальные копии некоторых изображений, и даже для больших и более сложных изображений дает что-то узнаваемое. Или, возможно, он не делает изображения, которые достаточно узнаваемы, но создает красивые изображения, которые явно получены из оригинала.
- 3 балла за умное использование набора символов Unicode
- 0 баллов за простое использование всего набора разрешенных символов
- 1 балл за использование ограниченного набора символов, которые можно переносить через Твиттер или в самых разных ситуациях.
- 2 балла за использование тематического подмножества символов, таких как только иероглифы Хань или только символы справа налево
- 3 балла за то, что вы делаете что-то действительно аккуратное, например, генерирование читаемого текста или использование символов, похожих на изображение, о котором идет речь
- 3 балла за умные алгоритмические подходы и стиль кода
- 0 баллов за что-то, что составляет 1000 строк кода только для уменьшения изображения, обрабатывать его как 1 бит на пиксель, а base64 кодировать это
- 1 балл за то, что использует стандартную технику кодирования и хорошо написано и кратко
- 2 балла за то, что вводит относительно новый метод кодирования, или, что удивительно коротко и чисто
- 3 балла за один вкладыш, который на самом деле дает хорошие результаты, или что-то новое, что открывает новые возможности в графическом кодировании (если это кажется малым количеством баллов за выход на новый уровень, помните, что такой результат, скорее всего, будет иметь высокий балл за эстетику также)
- 2 очка за скорость. При прочих равных условиях, чем быстрее, тем лучше, но приведенные выше критерии важнее скорости.
- 1 балл за запуск на свободном (с открытым исходным кодом) программном обеспечении, потому что я предпочитаю бесплатное программное обеспечение (обратите внимание, что C # будет по-прежнему иметь право на этот балл, пока он работает на Mono, аналогично, код MATLAB будет иметь право, если он будет работать на GNU Octave)
- 1 балл за фактическое соблюдение всех правил. Эти правила стали немного большими и сложными, поэтому я, вероятно, приму хорошие ответы, в которых одна маленькая деталь ошибочна, но я дам дополнительный балл любому решению, которое действительно следует всем правилам.
Эталонные изображения
Некоторые люди просили некоторые эталонные изображения. Вот несколько эталонных изображений, которые вы можете попробовать; здесь встроены уменьшенные версии, все они ссылаются на увеличенные версии изображения, если они вам нужны:
приз
Я предлагаю вознаграждение в 500 представителей (плюс 50, которые получает StackOverflow) для решения, которое мне нравится больше всего, на основе вышеуказанных критериев. Конечно, я призываю всех остальных голосовать здесь за их любимые решения.
Обратите внимание на крайний срок
Этот конкурс будет продолжаться до тех пор, пока не закончится щедрость, около 18:00 в субботу, 30 мая. Я не могу сказать точное время, когда оно закончится; это может быть где-то с 5 до 7 вечера. Я гарантирую, что посмотрю все записи, представленные до 14:00, и сделаю все возможное, чтобы просмотреть все записи, представленные до 16:00; если решения будут представлены после этого, у меня может не быть возможности оценить их до того, как я приму решение. Кроме того, чем раньше вы отправите заявку, тем больше у вас будет шансов на голосование, чтобы помочь мне выбрать лучшее решение, поэтому постарайтесь подать заявку раньше, чем прямо в срок.
Примечания Юникода
Также возникла путаница относительно того, какие символы Unicode разрешены. Диапазон возможных кодовых точек Юникода U+0000в U+10FFFF. Есть некоторые кодовые точки, которые никогда не могут использоваться в качестве символов Юникода при любом открытом обмене данными; это нехарактеры и суррогатные кодовые точки . Noncharacters определены в 5.1.0 секции Unidode Standard 16.7 в качестве значений U+FFFE, U+FFFF, U+пFFFE , U+пFFFF , где п является 1- 10шестнадцатеричное, а диапазонU+FDD0 -U+FDEF, Эти значения предназначены для внутреннего использования для конкретного приложения, и соответствующие приложения могут вырезать эти символы из текста, обработанного ими. Суррогатные кодовые точки, определенные в разделе 3.8 стандарта Unicode 5.1.0 как U+D800- U+DFFF, используются для кодирования символов за пределами базовой многоязычной плоскости в UTF-16; таким образом, невозможно представить эти кодовые точки непосредственно в кодировке UTF-16, и недопустимо кодировать их в любом другом кодировании. Таким образом, для целей этого конкурса я разрешу любую программу, которая кодирует изображения в последовательность не более чем 140 кодовых точек Юникода из диапазона U+0000- U+10FFFFисключая все нехарактерные и суррогатные пары, как определено выше.
Я предпочитаю решения, которые используют только назначенные символы, и даже лучшие, которые используют умные подмножества назначенных символов или делают что-то интересное с набором символов, который они используют. Список назначенных символов см. В базе данных символов Unicode ; обратите внимание, что некоторые символы перечислены непосредственно, а некоторые перечислены только как начало и конец диапазона. Также обратите внимание, что суррогатные кодовые точки перечислены в базе данных, но запрещены, как указано выше. Если вы хотите воспользоваться определенными свойствами символов, чтобы сделать выводимый текст более интересным, существует множество доступных баз данных символьной информации , таких как список именованных блоков кода и различные свойства символов.,
Поскольку в Twitter не указан точный набор символов, который они поддерживают, я буду снисходительно относиться к решениям, которые на самом деле не работают с Twitter, потому что некоторые символы имеют дополнительное значение или определенные символы удаляются. Желательно, но не обязательно, чтобы все закодированные выходы могли передаваться целыми и невредимыми через Twitter или другой сервис микроблогов, такой как identi.ca . Я видел некоторую документацию, в которой говорится, что Twitter-сущности кодирует <,> и &, и, таким образом, считает их как 4, 4 и 5 символов соответственно, но я сам не проверял это, и их счетчик символов JavaScript не кажется считать их таким образом.
Советы и ссылки
- Определение допустимых символов Юникода в правилах немного сложнее. Выбор одного блока символов, такого как унифицированные идеограммы CJK (U + 4E00 – U + 9FCF), может быть проще.
- Вы можете использовать существующие библиотеки изображений, такие как ImageMagick или Python Imaging Library , для манипулирования изображениями.
- Если вам нужна помощь в понимании набора символов Unicode и его различных кодировок, см. Это краткое руководство или подробный FAQ по UTF-8 в Linux и Unix .
- Чем раньше вы получите свое решение, тем больше времени мне (и другим людям, участвующим в голосовании) придется рассмотреть его. Вы можете редактировать свое решение, если улучшите его; Я буду основывать свою награду на самой последней версии, когда я в последний раз рассмотрю решения.
- Если вам нужен простой формат изображения для анализа и записи (и вы не хотите просто использовать существующий формат), я бы предложил использовать формат PPM . Это текстовый формат, с которым очень легко работать, и вы можете использовать ImageMagick для преобразования в него и из него.




