Если картинка стоит 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 для преобразования в него и из него.