Twitter image encoding challenge [zamknięty]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc / align = "center" bgcolor = " # e0ffe0 Zamknięte 9 lat temu. zamknięte . To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

jeśli obraz jest wart 1000 słów, to ile obrazu można zmieścić w 140 znakach?

Uwaga : to jest to ludzie! Ostateczny termin nagród jest tutaj, I po kilku trudnych rozważaniach, zdecydowałem, że wpis Boojuma ledwo przekroczył Sam Hocevar . Będę zamieszczać bardziej szczegółowe notatki, gdy będę miał okazję je napisać. Oczywiście, każdy powinien czuć się swobodnie, aby nadal przedstawiać rozwiązania i ulepszać rozwiązania dla ludzi do głosowania. Dziękuję wszystkim, którzy zgłosili się i wpisali; podobały mi się wszystkie. To była świetna zabawa dla mnie, aby uruchomić, i mam nadzieję, że to było zabawne zarówno dla uczestników i widzów.

Natknąłem się na ciekawy post o próbach skompresowania zdjęć do komentarza na Twitterze i wiele osób w tym wątku (i wątku na Reddicie) miało sugestie dotyczące różnych sposobów możesz to zrobić. Więc, myślę, że byłoby to dobre wyzwanie kodowania; niech ludzie wkładają swoje pieniądze tam, gdzie ich usta są, i pokazać, jak ich pomysły na kodowanie może prowadzić do więcej szczegółów w ograniczonej przestrzeni, że masz dostępne.

Wzywam was do wymyślenia ogólnego systemu do kodowania obrazów w 140 znakowych wiadomościach Twittera i dekodowania ich ponownie na obraz. Można używać znaków Unicode, więc na znak przypada więcej niż 8 bitów. Nawet pozwalając na Unicode znaki, jednak trzeba będzie skompresować obrazy na bardzo małą ilość miejsca; to z pewnością będzie stratna kompresja, a więc nie będzie musiał być subiektywne oceny o tym, jak dobry każdy wynik wygląda.

Oto wynik, że oryginalny autor, Quasimondo, dostał z jego kodowania (obraz jest na licencji Creative Commons Attribution-Noncommercial license ): Mona Lisa

Czy stać Cię na więcej?

Zasady

  1. Twój program musi mieć dwa tryby: kodowania i dekodowania .
  2. kiedy kodowanie :
    1. Twój program musi przyjąć jako wejście grafikę w dowolnym rozsądnym rastrze wybranym przez Ciebie formacie graficznym. Powiemy, że każdy format rastrowy obsługiwany przez ImageMagick liczy się jako rozsądny.
    2. Twój program musi wypisać komunikat, który może być reprezentowany w 140 lub mniej punktach kodu Unicode; 140 punktów kodu w zakresie U+0000U+10FFFF, wyłączając Nie-znaki (U+FFFE, U+FFFF, U+nFFFE, U+nFFFF gdzie n jest 110 szesnastkowym, a zakres U+FDD0U+FDEF) i zastępcze Punkty kodowe (U+D800U+DFFF). Może być wyprowadzony w dowolnym rozsądnym kodowaniu według twojego wyboru; dowolne kodowanie obsługiwane przez GNU iconv zostanie uznany za rozsądny, a kodowanie natywne lub kodowanie lokalne platformy prawdopodobnie będzie dobrym wyborem. Zobacz uwagi Unicode poniżej, aby uzyskać więcej informacji szczegóły.
  3. kiedy dekodowanie :
    1. Twój program powinien przyjąć jako Wejście Wyjście Twojego trybu kodowania .
    2. Twój program musi wypisać obraz w dowolnym rozsądnym formacie wybranego przez Ciebie, jak zdefiniowano powyżej, chociaż dla formatów wektorów wyjściowych są również w porządku.
    3. obraz wyjściowy powinien być przybliżeniem obrazu wejściowego; im bliżej można dostać się do obrazu wejściowego, tym lepiej.
    4. proces dekodowania może nie mieć dostępu do jakiekolwiek inne wyjście procesu kodowania inne niż wyjście określone powyżej; to znaczy, nie możesz przesłać obrazu gdzieś i wypisać adresu URL procesu dekodowania do pobrania, lub coś głupiego w tym stylu.
  4. W celu zachowania spójności w interfejsie użytkownika, program musi zachowywać się w następujący sposób:]}
    1. Twój program musi być skryptem, który może być ustawiony na wykonywalny na platformie z odpowiednim interpreterem, lub programem, który może być skompilowany do wykonywalny.
    2. Twój program musi przyjąć jako pierwszy argument encode lub {[18] } aby ustawić tryb.
    3. Twój program musi pobierać dane wejściowe w jeden lub więcej z następujących sposobów (jeśli zaimplementujesz ten, który pobiera nazwy plików, możesz również odczytywać i zapisywać z stdin i stdout, jeśli brakuje nazw plików):

      1. Pobieraj dane wejściowe ze standardowego wejścia i wytwarzaj dane wyjściowe na standardowym wyjściu.

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
        
      2. Pobranie danych z pliku o nazwie w drugim argumentu, i produkować wyjście w pliku o nazwie w trzecim.

        my-program encode input.png output.txt
        my-program decode output.txt output.png
        
  5. aby uzyskać rozwiązanie, napisz:
    1. Twój kod, w całości, i / lub link do niego umieszczony w innym miejscu (jeśli jest bardzo długi, lub wymaga wielu plików do skompilowania, czy coś).
    2. wyjaśnienie, jak to działa, jeśli nie jest to od razu oczywiste z kodu lub jeśli kod jest długi i ludzie będą zainteresowani podsumowaniem.
    3. przykładowy obrazek z oryginałem obraz, tekst, do którego jest kompresowany i dekodowany obraz.
    4. jeśli budujesz pomysł, który miał ktoś inny, proszę go przypisać. W porządku jest próbować udoskonalić czyjeś pomysły, ale musisz je przypisać.

Wytyczne

Są to zasadniczo zasady, które mogą być łamane, sugestie lub kryteria punktacji:]}
    Estetyka jest ważna. Będę oceniać i sugerować, że inni oceniają, na podstawie on:
    1. jak dobrze wygląda obraz wyjściowy i jak bardzo przypomina oryginał.
    2. jak ładnie wygląda tekst. Całkowicie przypadkowy gobbledigook jest OK, jeśli masz naprawdę sprytny schemat kompresji, ale chcę również zobaczyć odpowiedzi, które zamieniają obrazy w wielojęzyczne wiersze, lub coś mądrego w ten sposób. Zauważ, że autor oryginalnego rozwiązania zdecydował się używać tylko chińskich znaków, ponieważ wyglądało to ładniej.
    3. ciekawy kod i sprytne algorytmy są zawsze dobrze. Lubię Krótki, do punktu, i jasny kod, ale naprawdę sprytne skomplikowane algorytmy są również w porządku, tak długo, jak dają dobre wyniki.
  1. szybkość jest również ważna, choć nie tak ważna jak dobra Kompresja obrazu. Wolałbym mieć program, który potrafi konwertować obraz w dziesiątą część sekundy, niż coś, co będzie uruchamiać algorytmy genetyczne przez wiele dni.
  2. wolę krótsze rozwiązania od dłuższych, o ile są w miarę porównywalna pod względem jakości; zwięzłość jest cnotą.
  3. Twój program powinien być zaimplementowany w języku, który ma darmową implementację na Mac OS X, Linux lub Windows. Chciałbym móc uruchamiać programy, ale jeśli masz świetne rozwiązanie, które działa tylko pod MATLAB czy coś takiego, to w porządku.
  4. Twój program powinien być jak najbardziej ogólny; powinien działać dla jak największej liczby różnych obrazów, chociaż niektóre mogą przynieść lepsze wyniki niż i inni W szczególności:
    1. posiadanie kilku obrazów wbudowanych w program, do których pasuje i do których pisze odniesienie, a następnie tworzy pasujący obraz podczas dekodowania, jest dość słabe i obejmuje tylko kilka obrazów.
    2. program, który potrafi robić obrazy o prostych, płaskich, geometrycznych kształtach i rozkładać je na jakieś prymitywne wektory, jest dość sprytny, ale jeśli zawiedzie na obrazach przekraczających pewną złożoność, prawdopodobnie nie jest wystarczająco ogólny.
    3. program, który może tylko obrazy o określonym stałym współczynniku proporcji, ale robi z nimi dobrą robotę, również byłyby w porządku, ale nie idealne.
    4. może się okazać, że czarno-biały obraz może uzyskać więcej informacji w mniejszej przestrzeni niż kolorowy obraz. Z drugiej strony, może to ograniczyć rodzaje obrazów, do których ma zastosowanie; twarze wychodzą dobrze w czerni i bieli, ale abstrakcyjne projekty mogą nie pasować tak dobrze.
    5. jest w porządku, jeśli obraz wyjściowy jest mniejszy niż wejście, a jednocześnie jest mniej więcej taki sam proporcje. Jest OK, jeśli musisz przeskalować obraz, aby porównać go z oryginałem; ważne jest, jak wygląda.
  5. Twój program powinien generować wyniki, które mogłyby przejść przez Twittera i wyjść bez szwanku. Jest to tylko wskazówka, a nie reguła, ponieważ nie mogłem znaleźć żadnej dokumentacji na temat precyzyjnego zestawu obsługiwanych znaków, ale prawdopodobnie powinieneś unikać znaków kontrolnych, funky niewidoczne znaki łączące, znaki użytku prywatnego i na przykład.

Punktacja rubryka

Jako ogólny przewodnik po tym, jak będę oceniał rozwiązania przy wyborze zaakceptowanego rozwiązania, powiedzmy, że prawdopodobnie będę oceniał rozwiązania w skali 25 punktów (jest to bardzo szorstka sprawa i nie będę punktował niczego bezpośrednio, tylko używając tego jako podstawowej wskazówki): {]}

  • 15 punktów za to, jak dobrze schemat kodowania odtwarza szeroki zakres obrazów wejściowych. To subiektywna, estetyczna ocena
    • 0 oznacza to, że w ogóle nie działa, daje ten sam obraz za każdym razem, czy coś [80]}
    • 5 oznacza, że może kodować kilka obrazów, choć zdekodowana wersja wygląda brzydko i może w ogóle nie działać na bardziej skomplikowanych obrazach [80]}
    • 10 oznacza, że działa na szerokiej gamie obrazów i tworzy przyjemnie wyglądające obrazy, które czasami mogą być rozróżnialne [80]}
    • 15 oznacza, że produkuje doskonałe repliki niektórych obrazów, a nawet dla większych i bardziej złożonych obrazów, daje coś, co jest rozpoznawalne. A może nie tworzy obrazów, które są dość rozpoznawalne, ale tworzy piękne obrazy, które wyraźnie pochodzą z oryginału.
  • 3 punkty za sprytne wykorzystanie zestawu znaków Unicode
    • 0 punktów za proste użycie całego zestawu dozwolonych znaków
    • 1 punkt za użycie ograniczonego zestawu znaków, które są bezpieczne do przesyłania przez Twitter lub w szerszej gamie sytuacji.]}
    • 2 punkty aby użyć tematycznego podzbioru znaków, takich jak tylko ideogramy Han lub tylko symbole od prawej do lewej
    • 3 punkty za zrobienie czegoś naprawdę schludnego, jak generowanie czytelnego tekstu lub używanie znaków wyglądających jak dany obraz
  • 3 punkty za sprytne podejścia algorytmiczne i styl kodu
    • 0 punktów za coś, co jest 1000 linii kodu, aby przeskalować obraz w dół, traktować go jako 1 bit na piksel i kodować base64 że
    • 1 punkt za coś, co wykorzystuje standardową technikę kodowania i jest dobrze napisane i krótkie
    • 2 punkty za coś, co wprowadza stosunkowo nowatorską technikę kodowania, lub jest zaskakująco krótkie i czyste.]}
    • 3 punkty za jedną wkładkę, która faktycznie daje dobre wyniki lub coś, co otwiera nowe pole w kodowaniu Grafiki (jeśli wydaje się to małą liczbą punktów za przełom w kodowaniu Grafiki, pamiętaj, że wynik tak dobry prawdopodobnie będzie miał wysoką ocena estetyki)
  • 2 punkty za prędkość. Wszystkie inne są równe, szybciej jest lepiej, ale powyższe kryteria są ważniejsze niż prędkość
  • [48]} 1 punkt za uruchamianie na wolnym oprogramowaniu (open source), ponieważ wolę wolne oprogramowanie (zauważ, że C# nadal będzie się kwalifikować do tego punktu tak długo, jak będzie działać na Mono, podobnie kod MATLAB będzie kwalifikował się, jeśli będzie działać na GNU Octave)
  • 1 punkt za faktycznie następujące wszystkie zasady. Zasady te stały się nieco duże i skomplikowane, więc prawdopodobnie zaakceptuję inne dobre odpowiedzi, które mają jeden mały szczegół źle, ale dam dodatkowy punkt do każdego rozwiązania, które faktycznie przestrzega wszystkich zasad [80]}

Obrazy referencyjne

Niektórzy poprosili o obrazy referencyjne. Poniżej znajduje się kilka obrazów referencyjnych, które możesz wypróbować; mniejsze wersje są osadzone tutaj, wszystkie łączą się z większymi wersjami obrazu, jeśli potrzebujesz te:

Lena Mona Lisa Cornell Box Logo StackOverflow

Nagroda

Oferuję 500 rep bounty (plus 50, które startuje StackOverflow) za rozwiązanie, które najbardziej mi się podoba, w oparciu o powyższe kryteria. Oczywiście zachęcam wszystkich do głosowania nad ulubionymi rozwiązaniami również tutaj.

Uwaga na termin

[43]}konkurs będzie trwał do wyczerpania puli nagród, około 18: 00 w sobotę, maj 30. Nie mogę powiedzieć dokładnie, kiedy to się skończy; może to być gdziekolwiek od 5 do 7 PM. Gwarantuję, że przyjrzę się wszystkim zgłoszeniom do godziny 14: 00 i Dołożę wszelkich starań, aby przyjrzeć się wszystkim zgłoszeniom do godziny 16: 00; Jeśli rozwiązania zostaną przesłane później, mogę nie mieć okazji, aby dać im sprawiedliwe spojrzenie, zanim będę musiał podjąć decyzję. Ponadto, im wcześniej zgłosisz, tym więcej będziesz miał szans na głosowanie, aby móc pomóc mi wybrać najlepsze rozwiązanie, więc spróbuj złożyć wcześniej, a nie bezpośrednio na termin.

Unicode notes

Zaszło również pewne zamieszanie co do tego, jakie znaki Unicode są dozwolone. Zakres możliwych punktów kodu Unicode to U+0000 do U+10FFFF. Istnieją pewne punkty kodowe, które nigdy nie mogą być używane jako znaki Unicode w żadnej otwartej wymianie danych; są to znaki niebarakterystyczne i zastępcze Punkty kodowe. Wartości niezcharakterystyczne są zdefiniowane w standardzie Unidode 5.1.0 sekcja 16.7 jako wartości U+FFFE, U+FFFF, U+nFFFE, U+nFFFF gdzie n jest 110 szesnastkowym, a zakres U+FDD0U+FDEF. Wartości te są przeznaczone do użytku wewnętrznego specyficznego dla aplikacji, a zgodne aplikacje mogą usunąć te znaki z tekstu przetwarzanego przez nie. Punkty kodu zastępczego, zdefiniowane w standardzie Unicode 5.1.0 sekcja 3.8 jako U+D800U+DFFF, są używane do kodowania znaków poza podstawową płaszczyzną wielojęzyczną w UTF-16; dlatego jest niemożliwe jest reprezentowanie tych punktów kodu bezpośrednio w kodowaniu UTF-16, A kodowanie ich w innym kodowaniu jest nieprawidłowe. Tak więc, na potrzeby tego konkursu, dopuszczę każdy program, który koduje obrazy w sekwencji nie większej niż 140 punktów kodu Unicode z zakresu U+0000U+10FFFF, z wyłączeniem wszystkich par pozamałżeńskich i par zastępczych zdefiniowanych powyżej.

Będę preferował rozwiązania, które używają tylko przypisanych znaków, a jeszcze lepsze, które używają sprytnych podzbiorów przypisane znaki lub zrobić coś ciekawego z zestawu znaków, których używają. Lista przypisanych znaków znajduje się w bazie danych znaków Unicode ; zauważ, że niektóre znaki są wymienione bezpośrednio, podczas gdy niektóre są wymienione tylko jako początek i koniec zakresu. Należy również pamiętać, że zastępcze punkty kodu są wymienione w bazie danych, ale zabronione, jak wspomniano powyżej. Jeśli chcesz skorzystać z pewnych właściwości znaków, aby tekst, który wypisujesz, był bardziej interesujący, nie są różne bazy danych informacji o znakach dostępne, takie jak lista nazwanych bloków kodu i różne właściwości znaków .

Ponieważ Twitter nie określa dokładnego zestawu znaków, które obsługują, będę pobłażliwy w kwestii rozwiązań, które w rzeczywistości nie działają z Twitterem, ponieważ niektóre znaki liczą dodatkowe lub niektóre znaki są pozbawione. Preferowane jest, ale nie wymagane, aby wszystkie zakodowane wyjścia mogły być przesyłane bez szwanku za pośrednictwem Twittera lub innej usługi mikroblogowej, takiej jak identi.ca . widziałem dokumentację stwierdzającą, że Twitter entity-koduje i &, a tym samym liczy je odpowiednio jako 4, 4 i 5 znaków, ale sam tego nie testowałem, a ich licznik znaków JavaScript nie wydaje się liczyć ich w ten sposób.

Porady I Linki

  • definicja ważnych znaków Unicode w regułach jest nieco skomplikowana. Wybór pojedynczego bloku znaki, takie jak zunifikowane ideogramy CJK (U + 4E00-u+9FCF) mogą być łatwiejsze.
  • możesz używać istniejących bibliotek obrazów, takich jak ImageMagick lub Python Imaging Library , do manipulacji obrazami.
  • jeśli potrzebujesz pomocy w zrozumieniu zestawu znaków Unicode i jego różnych kodowań, zobacz ten krótki przewodnik lub ten szczegółowy FAQ na temat UTF-8 w Linuksie i Uniksie.
  • im wcześniej dostaniesz swoje rozwiązanie, tym więcej czasu (i inne osób głosujących) będzie musiał na to spojrzeć. Możesz edytować swoje rozwiązanie, jeśli je ulepszysz; będę opierał swoją nagrodę na najnowszej wersji, gdy przejrzę moje ostatnie spojrzenie na rozwiązania.
  • jeśli chcesz mieć łatwy format obrazu do analizy i zapisu (i nie chcesz używać tylko istniejącego formatu), sugeruję użycie formatu PPM. Jest to format tekstowy, który jest bardzo łatwy w obsłudze i możesz użyć ImageMagick do konwersji do i z niego.
Author: Brian Campbell, 2009-05-21

15 answers

Dobra, oto moje: nanocrunch.cpp i Cmakelistów .plik TXT do zbudowania go za pomocą CMake. opiera się na Magick++ ImageMagick API do większości obsługi obrazów. Wymaga również biblioteki GMP do arytmetyki bignum do kodowania łańcuchów.

Na wykresie dziennym widać, że na wykresie dziennym widać, że w okolicach 1000-1000 Podstawową ideą jest zrobienie zdjęcia, skalowanie kopii do 50% i szukanie elementów w różnych orientacje, które wyglądają podobnie do nie nakładających się na siebie bloków na oryginalnym obrazie. Wymaga to bardzo brutalnego podejścia do tych poszukiwań, ale to po prostu ułatwia wprowadzenie moich modyfikacji.

Pierwsza modyfikacja polega na tym, że zamiast patrzeć na dziewięćdziesiąt stopni obrotu i przewrócenia, mój program uwzględnia również orientacje 45 stopni. To jeszcze jeden bit na blok, ale bardzo pomaga jakość obrazu.

Inna sprawa, że regulacja kontrastu/jasności dla każdego z kolorów składowych każdego bloku jest zbyt drogie. Zamiast tego przechowuję mocno skwantowany kolor (paleta ma tylko 4 * 4 * 4 = 64 kolory), które po prostu mieszają się w pewnej proporcji. Matematycznie jest to równoważne zmiennej jasności i stałej regulacji kontrastu dla każdego koloru. Niestety, oznacza to również, że nie ma negatywnego kontrastu, aby odwrócić kolory.

Po obliczeniu pozycji, orientacji i koloru dla każdego bloku, koduje to do UTF-8 string. Po pierwsze, generuje bardzo duże bignum, aby reprezentować dane w tabeli bloków i rozmiar obrazu. Podejście do tego jest podobne do rozwiązania sama Hocevara - rodzaj dużej liczby z radixem, który różni się w zależności od pozycji.

Następnie konwertuje to na bazę niezależnie od rozmiaru dostępnego zestawu znaków. Domyślnie w pełni wykorzystuje przypisany zestaw znaków unicode, minus mniej niż, więcej niż, ampersand, control, combining i surogate oraz postacie prywatne. Nie jest ładny, ale działa. Możesz również skomentować domyślną tabelę i wybrać 7-bitowy Wydruk ASCII (ponownie z wyłączeniem znaków i&) lub zunifikowane ideogramy CJK. W tabeli, w której dostępne są kody znaków, zapisywana jest długość przebiegu zakodowana przemiennymi przebiegami nieprawidłowych i ważnych znaków.

W każdym razie, oto kilka obrazów i czasów (mierzone na moim starym 3.0 GHz P4), i skompresowane do 140 znaków w pełnym przypisanym zestawie unicode opisane powyżej. Ogólnie rzecz biorąc, jestem dość zadowolony z tego, jak wszystkie okazały się. Gdybym miał więcej czasu na pracę nad tym, prawdopodobnie spróbowałbym zmniejszyć blokowość dekompresowanych obrazów. Mimo to myślę, że wyniki są całkiem dobre dla ekstremalnego współczynnika kompresji. Zdekompresowane obrazy są nieco impresjonistyczne, ale uważam, że stosunkowo łatwo jest zobaczyć, jak bity odpowiadają oryginałowi.

Logo Stack Overflow (8,6 s na kodowanie, 7,9 s na dekodowanie, 485 bajty):
http://i44.tinypic.com/2w7lok1.png

Lena (32.8 s na kodowanie, 13.0 s na dekodowanie, 477 bajtów):
http://i42.tinypic.com/2rr49wg.png http://i40.tinypic.com/2rhxxyu.png

Mona Lisa (43.2 s na kodowanie, 14.5 s na dekodowanie, 490 bajtów):
http://i41.tinypic.com/ekgwp3.png http://i43.tinypic.com/ngsxep.png

Edit: CJK Unified Characters

Sam zapytał w komentarzach o korzystanie z tego z CJK. Oto wersja Mona Lisa skompresowana do 139 znaków z CJK Unified character set:

Http://i43.tinypic.com/2yxgdfk.png 咏璘驞凄脒鵚据蛥鸂拗朐朖辿韩瀦魷歪痫栘璯緍脲蕜抱揎頻蓼債鑡嗞靊寞柮嚛嚵籥聚隤慛絖銓馿渫櫰矍昀鰛掾撄粂敽牙稉擎蔍螎葙峬覧絀蹔抆惫冧笻哜搀澐芯譶辍澮垝黟偞媄童竽梀韠镰猳閺狌而羶喙伆杇婣唆鐤諽鷍鴞駫搶毤埙誖萜愿旖鞰萗勹鈱哳垬濅鬒秀瞛洆认気狋異闥籴珵仾氙熜謋繴茴晋髭杍嚖熥勳縿餅珝爸擸萿

Parametry strojenia u góry programu, którego użyłem do tego były: 19, 19, 4, 4, 3, 10, 11, 1000, 1000. Skomentowałem też pierwszą definicję number_assigned i kody, a także ostatnie ich definicje do wyboru zestawu znaków CJK Unified.

 244
Author: Boojum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:12:21

Pliki graficzne i źródło Pythona (Wersja 1 i 2)

Wersja 1 Oto moja pierwsza próba. Będę aktualizować jak idę.

Mam logo SO do 300 znaków prawie bezstratne. Moja technika wykorzystuje konwersję do grafiki wektorowej SVG, więc najlepiej sprawdza się on line art. W rzeczywistości jest to kompresor SVG, nadal wymaga, aby oryginalny art przeszedł etap wektoryzacji.

Do mojej pierwszej próby użyłem serwisu internetowego dla śladu PNG jednak istnieje wiele wolnych i niewolnych narzędzi, które mogą obsłużyć tę część, w tym potrace (open-source).

Oto wyniki

Oryginalne Logo SO http://www.warriorhut.org/graphics/svg_to_unicode/so-logo.png oryginał Decoded so Logo http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded.png po kodowaniu i dekodowaniu

Postacie: 300

Czas: nie mierzony, ale praktycznie natychmiastowy (nie wliczając etapy wektoryzacji / rasteryzacji)

Następnym etapem będzie osadzenie 4 symboli (punktów ścieżki SVG i poleceń) na znak unicode. W tej chwili mój Python build nie ma szerokiego wsparcia znaków UCS4, co ogranicza moją rozdzielczość na znak. Ograniczyłem również maksymalny zakres do dolnego końca zarezerwowanego zakresu unicode 0xD800, jednak gdy zbuduję listę dozwolonych znaków i filtr, aby ich uniknąć, teoretycznie mogę przesunąć wymaganą liczbę znaków tak nisko, jak 70-100 do logo powyżej.

Obecnie ograniczenie tej metody polega na tym, że wielkość wyjściowa nie jest stała. Zależy od liczby węzłów/punktów wektorowych po wektoryzacji. Automatyzacja tego limitu będzie wymagała albo pikselowania obrazu (co usuwa główną zaletę wektorów), albo wielokrotnego uruchamiania ścieżek przez etap upraszczania, aż do osiągnięcia żądanej liczby węzłów (co obecnie robię ręcznie w Inkscape).

Wersja 2

UPDATE : v2 jest teraz zakwalifikował się do rywalizacji. Zmiany:

  • wejście/wyjście sterowania wiersza poleceń i debugowanie
  • Do obsługi SVG używa parsera XML (lxml) zamiast regex
  • pakuje 2 segmenty ścieżek na symbol unicode
  • dokumentacja i sprzątanie
  • wsparcie style = "fill: color" I fill = "color"
  • szerokość/wysokość dokumentu zapakowane w pojedynczy znak
  • kolor ścieżki zapakowany w pojedynczy znak
  • kompresja kolorów jest osiągana przez wyrzucenie 4bits z dane kolorów na kolor, a następnie pakowanie go do postaci poprzez konwersję hex.

Postacie: 133

Czas : kilka sekund

V2 decoded http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded-v2.png po kodowaniu i dekodowaniu (Wersja 2)

Jak widzisz, tym razem są pewne artefakty. Nie jest to ograniczenie metody, ale błąd gdzieś w moich konwersjach. Artefakty zdarzają się, gdy punkty idą poza zakresem 0.0 - 127.0 i moje próby ich ograniczenia miały mieszany sukces. Rozwiązaniem jest po prostu skalowanie obrazu w dół, jednak miałem problemy ze skalowaniem rzeczywistych punktów, a nie obszaru roboczego lub matrycy grupy i jestem zbyt zmęczony, aby się tym przejmować. Krótko mówiąc, jeśli twoje punkty znajdują się w obsługiwanym zakresie, zazwyczaj działa.

Wierzę, że załamanie w środku jest spowodowane uchwytem przesuwającym się na drugą stronę uchwytu, z którym jest połączony. Zasadniczo punkty są zbyt blisko siebie w pierwsze miejsce. Uruchomienie filtra uproszczonego nad obrazem źródłowym przed kompresją powinno to naprawić i usunąć niepotrzebne znaki.

UPDATE : Ta metoda jest dobra dla prostych obiektów, więc potrzebowałem sposobu na uproszczenie złożonych ścieżek i zmniejszenie szumów. Do tego zadania użyłem Inkscape. Miałem trochę szczęścia w przygotowywaniu niepotrzebnych ścieżek za pomocą Inkscape, ale nie miałem czasu, aby spróbować go zautomatyzować. Zrobiłem kilka przykładowych SVG przy użyciu funkcji "Simplify" Inkscape do zmniejsz liczbę ścieżek.

Uproszczenie działa dobrze, ale może być powolne przy tak wielu ścieżkach.

Przykład Autotrace http://www.warriorhut.org/graphics/svg_to_unicode/autotrace_16_color_manual_reduction.png cornell box http://www.warriorhut.com/graphics/svg_to_unicode/cornell_box_simplified.png lena http://www.warriorhut.com/graphics/svg_to_unicode/lena_std_washed_autotrace.png

Śledzone miniatury http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_autotrace.png

Oto kilka ujęć o ultra niskiej rozdzielczości. Byłyby one bliższe limitowi 140 znaków, chociaż może być również potrzebna sprytna kompresja ścieżki.

Zadbane http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_groomed.png Uproszczone i rozpostarte.

Trianglulated http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_triangulated.png Uproszczony, rozpostarty i trójkątny.

autotrace --output-format svg --output-file cornell_box.svg --despeckle-level 20 --color-count 64 cornell_box.png

Powyżej: uproszczone ścieżki za pomocą autotrace .

Niestety mój parser nie Obsługuje wyjścia autotrace, więc nie wiem, w jaki sposób punkty mogą być używane i jak daleko je uprościć, niestety jest mało czasu na napisanie tego przed terminem. Jest to o wiele łatwiejsze do przetworzenia niż wyjście inkscape.

 288
Author: SpliFF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-31 06:53:10

Moje pełne rozwiązanie można znaleźć na http://caca.zoy.org/wiki/img2twit. posiada następujące cechy:

  • rozsądny czas kompresji (około 1 minuty dla wysokiej jakości)
  • szybka dekompresja (ułamek sekundy)
  • zachowuje oryginalny rozmiar obrazu (nie tylko proporcje)
  • [[9]} przyzwoita jakość rekonstrukcji (IMHO)
  • długość wiadomości i zestaw znaków (ASCII, CJK, Symbole) mogą być wybrane w czasie wykonywania
  • długość wiadomości i zestaw znaków są automatycznie wykrywane w czasie dekompresji
  • bardzo wydajne pakowanie Informacji

Http://caca.zoy.org/raw-attachment/wiki/img2twit/so-logo.png http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter4.png

蜥秓鋖筷聝诿缰偺腶漷庯祩皙靊谪獜岨幻寤厎趆脘搇梄踥桻理戂溥欇渹裏軱骿苸髙骟市簶璨粭浧鱉捕弫潮衍蚙瀹岚玧霫鏓蓕戲債鼶襋躻弯袮足庭侅旍凼飙驅據嘛掔倾诗籂阉嶹婻椿糢墤渽緛赐更儅棫武婩縑逡荨璙杯翉珸齸陁颗鳣憫擲舥攩寉鈶兓庭璱篂鰀乾丕耓庁錸努樀肝亖弜喆蝞躐葌熲谎蛪曟暙刍镶媏嘝驌慸盂氤缰殾譑

Oto szorstki przegląd procesu kodowania:

  • liczba dostępnych bitów jest obliczana na podstawie żądanej długości wiadomości i użytecznego zestawu znaków
  • obraz źródłowy jest podzielony na tyle kwadratowych komórek, na ile pozwalają dostępne bity
  • stała liczba punktów (obecnie 2) ma wpływ na każdą komórkę, z początkowymi współrzędnymi i wartościami kolorów
  • następujące czynności powtarza się do momentu spełnienia warunku jakości:
    • punkt jest wybierany losowo
    • An operacja jest wykonywana losowo w tym punkcie (przesuwając ją wewnątrz komórki, zmieniając jej kolor)
    • jeśli wynikowy obraz (patrz proces dekodowania poniżej) znajduje się bliżej obrazu źródłowego, operacja jest zachowywana
  • Rozmiar obrazu i lista punktów jest zakodowana w UTF-8

I jest to proces dekodowania:

  • Rozmiar obrazu i punkty są odczytywane ze strumienia UTF-8
  • dla każdego piksela docelowego obrazu:
    • lista naturalnych blizn jest obliczona
    • [[9]} ostateczny kolor piksela jest ustalany jako średnia ważona kolorów naturalnych sąsiadów [10]}
Najbardziej oryginalną częścią programu jest strumień bitów. Zamiast pakować wartości wyrównane do bitów (stream <<= shift; stream |= value), pakuję dowolne wartości, które nie mieszczą się w przedziale mocy dwóch (stream *= range; stream += value). Wymaga to obliczeń bignum i jest oczywiście dużo wolniejsze, ale daje mi 2009.18 bitów zamiast 1960 przy użyciu 20902 głównych znaków CJK (to jeszcze trzy punkty mogę umieścić w danych). A przy użyciu ASCII daje mi 917.64 bity zamiast 840.

Zdecydowałem się odrzucić metodę wstępnego obliczania obrazu, która wymagałaby ciężkiego uzbrojenia (wykrywanie narożników, ekstrakcja cech, kwantyzacja kolorów...), bo na początku nie byłem pewien, czy to naprawdę pomoże. Teraz zdaję sobie sprawę, że konwergencja jest powolna (1 minuta jest do przyjęcia, ale mimo to jest powolna) i mogę spróbować poprawić na to.

Główna pętla dopasowania jest luźno zainspirowana bezpośrednim binarnym algorytmem ditheringu Seacha (gdzie piksele są losowo zamieniane lub odwracane, aż do uzyskania lepszego półtonu). Obliczenie energii jest prostą odległością root-mean-square, ale najpierw wykonam filtr mediany 5x5 na oryginalnym obrazie. Rozmycie Gaussa prawdopodobnie lepiej odzwierciedlałoby zachowanie ludzkiego oka, ale nie chciałem tracić ostrych krawędzi. Zdecydowałem się również na symulowane wyżarzanie lub inne trudne do dostrojenia metody, bo nie mam miesięcy na kalibrację procesu. Tak więc znacznik "quality" reprezentuje tylko liczbę iteracji, które są wykonywane w każdym punkcie przed zakończeniem kodera.

Http://caca.zoy.org/raw-attachment/wiki/img2twit/Mona_Lisa_scaled.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter2.png

苉憗揣嶕繠剳腏篮濕茝霮墧蒆棌杚蓳縳樟赒肴飗噹砃燋任朓峂釰靂陴貜犟掝喗讄荛砙矺敨鷾瓔亨髎芟氲簵鸬嫤鉸俇激躙憮鄴甮槺骳佛愚猪駪惾嫥綖珏矯坼堭颽箽赭飉訥偁箝窂蹻熛漧衆橼愀航玴毡裋頢羔恺墎嬔鑹楄瑥鶼呍蕖抲鸝秓苾绒酯嵞脔婺污囉酼俵菛琪棺则辩曚鸸職銛蒝礭鱚蟺稿纡醾陴鳣尥蟀惘鋁髚忩祤脤养趯沅况

Chociaż nie wszystkie obrazy kompresują się dobrze, jestem zaskoczony wynikami i naprawdę zastanawiam się, jakie istnieją inne metody, które mogą skompresować obraz do 250 bajtów.

Mam też małe filmy o ewolucji stanu kodera z losowego stanu początkowego i z "dobrego" początkowego Stan .

Edit: oto jak metoda kompresji porównuje się z JPEG. Po lewej, jamoes powyżej 536-bajtowego obrazu. Po prawej stronie Mona Lisa skompresowała do 534 bajtów za pomocą opisanej tutaj metody (wspomniane bajty odnoszą się do bajtów danych, dlatego ignorując bity marnowane przez użycie znaków Unicode):

Http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona2.png

Edit : po prostu zamieniłem tekst CJK na najnowsze wersje obrazów.

 199
Author: sam hocevar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-30 17:05:06

Poniższe nie jest formalnym zgłoszeniem, ponieważ moje oprogramowanie nie zostało w żaden sposób dostosowane do wskazanego zadania. DLI można opisać jako optymalizujący kodek stratny ogólnego przeznaczenia. Jest to rekord PSNR I MS-SSIM do kompresji obrazu, i pomyślałem, że byłoby interesujące zobaczyć, jak to działa w tym konkretnym zadaniu. Użyłem referencyjnego obrazu Mona Lisa i skalowałem go do 100x150, a następnie użyłem DLI do skompresowania go do 344 bajtów.

Mona Lisa DLI http://i40.tinypic.com/2md5q4m.png

Dla porównania z próbkami skompresowanymi JPEG i IMG2TWIT, użyłem DLI do skompresowania obrazu do 534 bajtów. JPEG to 536 bajtów, a IMG2TWIT to 534 bajty. Obrazy zostały skalowane do mniej więcej tego samego rozmiaru w celu łatwego porównania. JPEG jest lewym obrazem, IMG2TWIT jest środkiem, a DLI jest Prawym obrazem.

Porównanie http://i42.tinypic.com/302yjdg.png

Obraz DLI udaje się zachować pewne z rysów twarzy, przede wszystkim słynny uśmiech :).

 45
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-29 06:46:05

Ogólny przegląd mojego rozwiązania byłby następujący:

  1. zacznę od obliczenia maksymalnej ilości surowych danych, które można zmieścić w 140 znakach utf8.
    • (zakładam, że utf8, czyli to, co oryginalna strona twierdziła, że twitter przechowuje wiadomości w. Różni się to od powyższego stwierdzenia problemu, które prosi o utf16.)
    • używając tego FAQ utf8, obliczam, że maksymalna liczba bitów, które można zakodować w pojedynczym znaku utf8, wynosi 31 bitów. Aby to zrobić, użyłbym wszystkich znaków, które są w zakresie U-04000000-u-7FFFFFFF. (1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx, jest 31 x, dlatego mogę kodować do 31 bitów).
    • 31 bitów razy 140 znaków równa się 4340 bitów. Podziel to przez 8, aby uzyskać 524,5 i zaokrągl to do 542 bajtów.
    • (jeśli ograniczymy się do utf16, wtedy możemy zapisać tylko 2 bajty na znak, co równa się 280 bajtów).
  2. skompresuj obraz za pomocą standardowej kompresji jpg.
    • Zmień rozmiar obrazu na około 50x50px, a następnie spróbuj skompresować go na różnych poziomach kompresji, dopóki nie uzyskasz obrazu, który będzie maksymalnie zbliżony do 542 bajtów, bez przechodzenia dalej.
    • to jest przykład Mona lisa skompresowana do 536 bajtów.
  3. koduje surowe bity skompresowanego obrazu na znaki utf-8.
    • Zastąp każde x w następujące bajty: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx z bitami z obrazu.
    • ta część prawdopodobnie byłaby częścią, w której większość kodu musiałaby zostać napisana, ponieważ obecnie nie istnieje nic, co mogłoby to zrobić.

Wiem, że prosiłeś o kod, ale nie chcę tracić czasu na kodowanie tego. Pomyślałem, że wydajny projekt może przynajmniej zainspirować kogoś innego do zakodowania tego w górę.

Myślę, że główną zaletą mojego proponowanego rozwiązania jest to, że wykorzystuje ono jak najwięcej istniejących technologii. Może to być zabawne, aby spróbować napisać dobry algorytm kompresji, ale jest gwarantowana, że będzie lepszy algorytm tam, najprawdopodobniej napisany przez ludzi, którzy mają stopień w wyższej matematyki.

Jeszcze jedna ważna uwaga jest taka, że jeśli zdecyduje się, że utf16 jest preferowanym kodowaniem, To rozwiązanie to się rozpada. JPEG nie działa po skompresowaniu do 280 bajtów. Chociaż może istnieje lepszy algorytm kompresji niż jpg dla tego konkretnego problemu.

 21
Author: Stephen McCarthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-21 14:26:49

Dobra, spóźniłem się na mecz, ale mimo to zrobiłem swój projekt.

To zabawkowy algorytm genetyczny, który wykorzystuje półprzezroczyste kolorowe kółka do odtworzenia początkowego obrazu.

Funkcje:

    Czysta Lua. Działa wszędzie tam, gdzie działa Tłumacz Lua.
  • używa formatu netpbm P3
  • zawiera kompleksowy zestaw testów jednostkowych
  • zachowuje oryginalny rozmiar obrazu

Mis-feautres:

  • slow
  • w tej przestrzeni ogranicza to zachowuje tylko podstawowy schemat kolorów początkowego obrazu i ogólny zarys kilku jego cech.

Oto przykład, który reprezentuje Lenę: 犭楊谷杌蒝螦界匘玏扝匮俄归晃客猘摈硰划刀萕码摃斢嘁蜁嚎耂澹簜僨砠偑婊內團揕忈義倨襠凁梡岂掂戇耔攋斘眐奡萛狂昸箆亲嬎廙栃兡塅受橯恰应戞优猫僘瑩吱賾卣朸杈腠綍蝘猕屐稱悡詬來噩压罍尕熚帤厥虤嫐虲兙罨縨炘排叁抠堃從弅慌螎熰標宑簫柢橙拃丨蜊缩昔儻舭勵癳冂囤璟彔榕兠摈侑蒖孂埮槃姠璐哠眛嫡琠枀訜苄暬厇廩焛瀻严啘刱垫仔

oryginalna lenazakodowana Lena

Kod znajduje się w repozytorium Mercurial w bitbucket.org. Sprawdź http://bitbucket.org/tkadlubo/circles.lua

 20
Author: Tadeusz A. Kadłubowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-22 11:17:40

Poniżej znajduje się moje podejście do problemu i muszę przyznać, że był to dość ciekawy projekt do pracy, zdecydowanie poza moim normalnym obszarem pracy i dał mi coś nowego do nauczenia się.

Podstawowa idea stojąca za moim jest następująca:

  1. dół-próbka obrazu w skali szarości tak, aby było w sumie 16 różnych odcieni
  2. Preform RLE na obrazku
  3. spakuj wyniki do znaków UTF-16
  4. Preform RLE na spakowane wyniki, aby usunąć powielanie znaków

Okazuje się, że to działa, ale tylko w ograniczonym zakresie, jak widać na przykładowych zdjęciach poniżej. Jeśli chodzi o wynik, poniżej znajduje się przykładowy tweet, specjalnie dla obrazu Lena pokazanego w próbkach.

乤乤万乐唂伂倂倁企儂2企倁3企倁2企伂8企伂3企伂5企倂倃伂倁3企儁企2伂倃5企倁3企倃4企倂企倁企伂2企伂5企倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻�乹Ꮛ靆䍼

Jak widać, próbowałem nieco ograniczyć zestaw znaków; jednak podczas przechowywania danych koloru obrazu wystąpiły problemy. Ponadto, ten schemat kodowania również ma tendencję do marnowania kilku bitów danych, które mogłyby być wykorzystane do dodatkowych informacji o obrazie.

Jeśli chodzi o czas wykonywania, dla małych obrazów kod jest niezwykle szybki, około 55ms dla przykładowych obrazów, ale czas wzrasta wraz z większymi obrazami. Dla obrazka referencyjnego 512x512 Lena czas pracy wynosił 1182ms. należy zauważyć, że szanse są całkiem spore, że sam kod nie jest zbyt zoptymalizowany pod kątem wydajności (np. wszystko jest obsługiwane jako Bitmap ), więc czasy mogą się nieco obniżyć po pewnym refaktoryzacji.

Zapraszam do zaproponowania mi wszelkich sugestii, co mogłem zrobić lepiej lub co może być nie tak z kodem. Pełna lista czasów uruchomienia i przykładowe wyniki można znaleźć w następującej lokalizacji: http://code-zen.info/twitterimage/

Update One

Zaktualizowałem kod RLE używany podczas kompresji tweet ciąg zrobić podstawowe spojrzenie wstecz, a jeśli tak, to Użyj tego do wyjścia. Działa to tylko dla par wartości liczbowych, ale zapisuje kilka znaków danych. Czas pracy jest mniej więcej taki sam, jak jakość obrazu, ale tweety wydają się być nieco mniejsze. Zaktualizuję wykres na stronie internetowej po zakończeniu testów. Poniżej znajduje się jeden z przykładowych ciągów tweet, ponownie dla małej wersji Leny:

乤乤万乐唂伂倂倁企儂2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グ儁企2伂倃ガ倁ジ倃4企倂企倁企伂ツ伂ス倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻�乹Ꮛ靆䍼

Update Two

Kolejna mała aktualizacja, ale zmodyfikowałem kod, aby zapakować odcienie kolorów w grupy po trzy w przeciwieństwie do czterech, to wymaga trochę więcej miejsca, ale jeśli czegoś nie brakuje, powinno to oznaczać, że" dziwne " znaki nie pojawiają się już tam, gdzie są dane kolorów. Ponadto zaktualizowałem kompresję nieco bardziej, aby mogła teraz działać na całym łańcuchu, w przeciwieństwie do tylko blok liczby kolorów. Wciąż testuję czasy uruchamiania, ale wydają się być nominalnie lepsze; jednak jakość obrazu jest nadal taka sama. Poniżej znajduje się najnowsza wersja tweeta Lena:

2乤万乐唂伂倂倁企儂2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グ儁企2伂倃ガ倁ジ倃4企倂企倁企伂ツ伂ス倁企伂坹坼坶坻刾啩容力吹婩媷劝圿咶坼妛啭奩嗆婣冷咛啫凃奉佶坍均喳女媗决兴宗喓夽兴唹屹冷圶埫奫唓坤喝奎似商嗉乃

Logo StackOverflow http://code-zen.info/twitterimage/images/stackoverflow-logo.bmp Cornell Box http://code-zen.info/twitterimage/images/cornell-box.bmp Lena http://code-zen.info/twitterimage/images/lena.bmp Mona Lisa http://code-zen.info/twitterimage/images/mona-lisa.bmp

 19
Author: Rob Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 13:28:34

Ten algorytm genetyczny, który napisał Roger Alsing, ma dobry współczynnik kompresji, kosztem długich czasów kompresji. Powstały wektor wierzchołków może być dodatkowo skompresowany za pomocą algorytmu stratnego lub bezstratnego.

Http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

Byłby interesujący program do wdrożenia, ale nie będę go przegapił.

 15
Author: CiscoIPPhone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-21 09:52:12

W oryginalnym wyzwaniu limit rozmiaru jest zdefiniowany jako to, co Twitter nadal pozwala wysłać, Jeśli wkleisz tekst w ich polu tekstowym i naciśniesz "update". Jak niektórzy poprawnie zauważyli, różni się to od tego, co można wysłać jako wiadomość SMS z telefonu komórkowego.

Co nie jest wyraźnie wymienione (ale co moja osobista zasada była) jest to, że powinien być w stanie wybrać tweeted wiadomość w przeglądarce, skopiować go do schowka i wkleić go do pola tekstowego z twojego dekoder, dzięki czemu może go wyświetlić. Oczywiście możesz również zapisać wiadomość jako plik tekstowy i odczytać ją z powrotem lub napisać narzędzie, które uzyskuje dostęp do API Twittera i odfiltrowuje każdą wiadomość, która wygląda jak kod obrazu(specjalne znaczniki ktoś? wink wink ). Ale zasada jest taka, że wiadomość musi przejść przez Twittera, zanim możesz ją odszyfrować.

Powodzenia z 350 bajtami-wątpię, czy uda ci się z nich skorzystać.

 12
Author: Quasimondo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-22 11:41:20

Publikowanie obrazu monochromatycznego lub w skali szarości powinno poprawić Rozmiar obrazu, który można zakodować w tej przestrzeni, ponieważ nie zależy ci na Kolorze.

Prawdopodobnie zwiększa wyzwanie przesłania trzech obrazów, które po połączeniu dają pełny kolor obrazu, zachowując jednocześnie wersję monochromatyczną na każdym oddzielnym obrazie.

Dodaj trochę kompresji do powyższego i może zacząć wyglądać realnie...

Nice!!! Teraz wzbudziliście moje zainteresowanie. Żadna praca nie będzie skończone do końca dnia...

 12
Author: Gineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 14:07:55

Odnośnie kodowania/dekodowania części tego wyzwania. base16b.org to moja próba określenia standardowej metody bezpiecznego i wydajnego kodowania danych binarnych w wyższych płaszczyznach Unicode.

Niektóre funkcje:

  • używa tylko prywatnych obszarów użytkownika Unicode
  • koduje do 17 bitów na znak; prawie trzy razy bardziej wydajny niż Base64
  • dostarczana jest referencyjna implementacja kodu/dekodu w Javascript
  • niektóre przykładowe kodowania to dołączone, w tym Twitter i Wordpress

Sorry, ta odpowiedź przychodzi o wiele za późno na oryginalny konkurs. Rozpocząłem projekt niezależnie od tego posta, który odkryłem w połowie.

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 01:39:09

Pomysł przechowywania kilku obrazów referencyjnych jest interesujący. Czy byłoby tak źle przechowywać powiedzmy 25MB przykładowych obrazów, a koder próbuje skomponować obraz używając ich bitów? Przy takiej drobnej rurze, maszyny na obu końcach z konieczności będą znacznie większe niż ilość danych przepływających przez, więc jaka jest różnica między 25MB kodu, a 1MB kodu i 24MB danych obrazu?

(uwaga oryginalne wytyczne wykluczyły ograniczenie wejścia do zdjęcia już w bibliotece - nie sugeruję).

 8
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 01:50:54

Głupi pomysł, ale sha1(my_image) spowodowałby "doskonałą" reprezentację dowolnego obrazu (ignorując kolizje). Oczywistym problemem jest to, że proces dekodowania wymaga nadmiernych ilości brutalnego wymuszania..

1-bitowy monochromatyczny byłby nieco łatwiejszy.. Każdy piksel staje się 1 lub 0, więc masz 1000 bitów danych dla obrazu 100 * 100 pikseli. Ponieważ hash SHA1 ma 41 znaków, możemy zmieścić trzy w jedną wiadomość, wystarczy tylko 2 zestawy 3333 bitów i jeden zestaw 3334 (choć nawet jest to prawdopodobnie nadal nieordynowane) To nie do końca praktyczne. Nawet z obrazem o stałej długości 1-bit 100*100px.., zakładając, że nie przeliczyłem, 49995000 kombinacji, lub 16661667 po podzieleniu na trzy.
def fact(maxu):
        ttl=1
        for i in range(1,maxu+1):
                ttl=ttl*i
        return ttl

def combi(setsize, length):
    return fact(length) / (fact(setsize)*fact(length-setsize))

print (combi(2, 3333)*2) + combi(2, 3334)
# 16661667L
print combi(2, 10000)
# 49995000L
 8
Author: dbr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-31 16:15:04

Tutaj kompresja jest dobra.

Http://www.intuac.com/userport/john/apt/

Http://img86.imageshack.us/img86/4169/imagey.jpg http://img86.imageshack.us/img86/4169/imagey.jpg

Użyłem następującego pliku wsadowego:

capt mona-lisa-large.pnm out.cc 20
dapt out.cc image.pnm
Pause

Rozmiar pliku wynikowego wynosi 559 bajtów.

 8
Author: 2 revs, 2 users 96%Pieter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 07:04:06

Pomysł: czy można użyć czcionki jako palety? Spróbuj rozbić obraz w szeregu wektorów próbując opisać je kombinacją zbiorów wektorowych (każdy znak jest w zasadzie zbiorem wektorów). Jest to użycie czcionki jako słownika. Mógłbym na przykład użyć l jako linii pionowej i a-jako linii poziomej? To tylko pomysł.

 0
Author: Maurits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-17 20:53:59