595 Stimmen

Herausforderung der Twitter-Bildkodierung

Wenn ein Bild mehr als 1000 Worte sagt, wie viel von einem Bild kann man dann in 140 Zeichen unterbringen?

Nota : Das war's, Leute! Der Abgabetermin für das Kopfgeld ist da, und nach reiflicher Überlegung habe ich beschlossen, dass Boojum's Eintrag nur knapp verdrängt Sam Hocevar's . Ich werde ausführlichere Notizen veröffentlichen, sobald ich die Gelegenheit hatte, sie zu schreiben. Natürlich kann jeder auch weiterhin Lösungen einreichen und Lösungen verbessern, über die dann abgestimmt werden kann. Vielen Dank an alle, die einen Beitrag eingereicht haben; sie haben mir alle gefallen. Es hat mir sehr viel Spaß gemacht, diesen Wettbewerb zu leiten, und ich hoffe, dass er sowohl den Teilnehmern als auch den Zuschauern Spaß gemacht hat.

Ich stieß auf dieser interessante Beitrag über den Versuch, Bilder in einem Twitter-Kommentar zu komprimieren, und viele Leute in diesem Thread (und ein Thread auf Reddit ) hatte Vorschläge für verschiedene Möglichkeiten, wie man es machen könnte. Ich denke, das wäre eine gute Herausforderung für die Programmierung. Die Leute sollen zeigen, was sie drauf haben, und wie ihre Ideen zur Kodierung zu mehr Details auf dem begrenzten Platz führen können, der zur Verfügung steht.

Ich fordere Sie auf, ein allgemeines System zur Kodierung von Bildern in 140-Zeichen-Twitter-Nachrichten und deren Dekodierung in ein Bild zu entwickeln. Sie können Unicode-Zeichen verwenden, so dass Sie mehr als 8 Bit pro Zeichen erhalten. Aber selbst wenn Sie Unicode-Zeichen verwenden, müssen Sie die Bilder auf sehr kleinem Raum komprimieren. Dies wird sicherlich eine verlustbehaftete Komprimierung sein, so dass subjektiv beurteilt werden muss, wie gut jedes Ergebnis aussieht.

Hier ist das Ergebnis, dass der ursprüngliche Autor, Quasimondo aus seiner Kodierung (das Bild ist lizenziert unter einer Creative Commons Namensnennung-Nichtkommerzielle Lizenz ): Mona Lisa

Können Sie es besser?

Regeln

  1. Ihr Programm muss zwei Modi haben: Kodierung y Dekodierung .

  2. Wenn Kodierung :

    1. Ihr Programm muss als Eingabe eine Grafik in einer beliebigen Raster Grafikformat Ihrer Wahl. Wir sagen, dass jedes Rasterformat, das von ImageMagick gilt als angemessen.
    2. Ihr Programm muss eine Nachricht ausgeben, die in 140 oder weniger Unicode-Codepunkten dargestellt werden kann; 140 Codepunkte im Bereich U+0000 - U+10FFFF ohne Nicht-Zeichen ( U+FFFE , U+FFFF , U+ n FFFE , U+ n FFFF wobei n es 1 - 10 hexadezimal, und der Bereich U+FDD0 - U+FDEF ) und Surrogat-Codepunkte ( U+D800 - U+DFFF ). Sie kann in jeder vernünftigen Kodierung Ihrer Wahl ausgegeben werden; jede Kodierung, die von GNU iconv wird als angemessen betrachtet, und die plattformeigene Kodierung oder die Kodierung des Gebietsschemas ist wahrscheinlich eine gute Wahl. Siehe Unicode-Hinweise unten für weitere Einzelheiten.
  3. Wenn Dekodierung :

    1. Ihr Programm sollte als Eingabe die Ausgabe Ihrer Kodierung Modus.
    2. Ihr Programm muss ein Bild in jedem vernünftigen Format Ihrer Wahl ausgeben, wie oben definiert, obwohl für die Ausgabe auch Vektorformate in Ordnung sind.
    3. Die Bildausgabe sollte eine Annäherung an das Eingabebild sein; je näher man dem Eingabebild kommen kann, desto besser.
    4. Der Dekodierungsprozess darf keinen Zugriff auf eine andere Ausgabe des Kodierungsprozesses haben als die oben angegebene, d. h. Sie können das Bild nicht irgendwo hochladen und die URL ausgeben, damit der Dekodierungsprozess es herunterladen kann, oder etwas Ähnliches.
  4. Um die Konsistenz der Benutzeroberfläche zu gewährleisten, muss sich Ihr Programm wie folgt verhalten:

    1. Ihr Programm muss ein Skript sein, das auf einer Plattform mit dem entsprechenden Interpreter ausgeführt werden kann, oder ein Programm, das zu einer ausführbaren Datei kompiliert werden kann.
    2. Ihr Programm muss als erstes Argument entweder encode o decode um den Modus einzustellen.
    3. Ihr Programm muss Eingaben auf eine oder mehrere der folgenden Arten entgegennehmen (wenn Sie diejenige implementieren, die Dateinamen entgegennimmt, können Sie auch von stdin und stdout lesen und schreiben, wenn keine Dateinamen vorhanden sind):

      1. Nimmt die Eingabe von Standard-In und gibt die Ausgabe auf Standard-Out aus.

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
      2. Nimmt die Eingabe aus einer Datei, die im zweiten Argument genannt wird, und erzeugt die Ausgabe in der Datei, die im dritten Argument genannt wird.

        my-program encode input.png output.txt
        my-program decode output.txt output.png
  5. Für Ihre Lösung, bitte posten:

    1. Ihren vollständigen Code und/oder einen Link dazu, der an anderer Stelle gehostet wird (wenn er sehr lang ist oder viele Dateien zum Kompilieren benötigt oder ähnliches).
    2. Eine Erklärung, wie es funktioniert, wenn es nicht sofort aus dem Code ersichtlich ist oder wenn der Code lang ist und die Leute an einer Zusammenfassung interessiert sind.
    3. Ein Beispielbild mit dem Originalbild, dem Text, auf den es komprimiert wurde, und dem dekodierten Bild.
    4. Wenn Sie auf einer Idee aufbauen, die jemand anderes hatte, nennen Sie diese bitte. Es ist in Ordnung, wenn Sie versuchen, die Idee eines anderen zu verfeinern, aber Sie muss sie zuordnen.

Leitlinien

Dabei handelt es sich im Wesentlichen um Regeln, die gebrochen werden dürfen, Vorschläge oder Bewertungskriterien:

  1. Ästhetik ist wichtig. Ich beurteile und schlage vor, dass andere Leute auf der Grundlage dieser Kriterien urteilen:
    1. Wie gut das ausgegebene Bild aussieht und wie sehr es dem Original ähnelt.
    2. Wie schön der Text aussieht. Völlig willkürliches Kauderwelsch ist in Ordnung, wenn Sie ein wirklich cleveres Komprimierungsschema haben, aber ich möchte auch Antworten sehen, die Bilder in mehrsprachige Gedichte verwandeln, oder etwas ähnlich Cleveres. Beachten Sie, dass der Autor der Originallösung beschlossen hat, nur chinesische Schriftzeichen zu verwenden, weil es so besser aussieht.
    3. Interessanter Code und clevere Algorithmen sind immer gut. Ich mag kurzen, prägnanten und klaren Code, aber wirklich clevere, komplizierte Algorithmen sind auch in Ordnung, solange sie gute Ergebnisse liefern.
  2. Die Geschwindigkeit ist ebenfalls wichtig, wenn auch nicht so wichtig wie die Qualität der Komprimierung des Bildes. Ich habe lieber ein Programm, das ein Bild in einer Zehntelsekunde konvertieren kann, als eines, das tagelang genetische Algorithmen ausführt.
  3. Ich ziehe kürzere Lösungen längeren vor, solange sie qualitativ einigermaßen vergleichbar sind; Kürze ist eine Tugend.
  4. Ihr Programm sollte in einer Sprache implementiert sein, für die es eine frei verfügbare Implementierung unter Mac OS X, Linux oder Windows gibt. Ich würde die Programme gerne ausführen können, aber wenn Sie eine großartige Lösung haben, die nur unter MATLAB oder so etwas, das ist in Ordnung.
  5. Ihr Programm sollte so allgemein wie möglich sein; es sollte für so viele verschiedene Bilder wie möglich funktionieren, obwohl einige vielleicht bessere Ergebnisse liefern als andere. Im Besonderen:
    1. Ein paar Bilder in das Programm einzubauen, die es abgleicht und einen Verweis darauf schreibt, und dann das passende Bild bei der Dekodierung zu erzeugen, ist ziemlich lahm und wird nur wenige Bilder abdecken.
    2. Ein Programm, das Bilder einfacher, flacher, geometrischer Formen in ein Vektorprimitiv zerlegen kann, ist ziemlich raffiniert, aber wenn es bei Bildern jenseits einer bestimmten Komplexität versagt, ist es wahrscheinlich nicht allgemein genug.
    3. Ein Programm, das nur Bilder eines bestimmten festen Seitenverhältnisses aufnehmen kann, aber gute Arbeit damit leistet, wäre auch OK, aber nicht ideal.
    4. Sie werden feststellen, dass ein Schwarz-Weiß-Bild mehr Informationen auf kleinerem Raum darstellen kann als ein Farbbild. Andererseits kann das die Art der Bilder einschränken, für die es geeignet ist. Gesichter kommen in Schwarzweiß gut zur Geltung, aber abstrakte Designs sind vielleicht nicht so gut.
    5. Es ist völlig in Ordnung, wenn das Ausgabebild kleiner ist als das Eingabebild, aber ungefähr die gleichen Proportionen aufweist. Es ist in Ordnung, wenn Sie das Bild vergrößern müssen, um es mit dem Original zu vergleichen; wichtig ist, wie es aussieht.
  6. Ihr Programm sollte eine Ausgabe produzieren, die tatsächlich durch Twitter gehen und unbeschadet wieder herauskommen könnte. Dies ist nur eine Richtlinie und keine Regel, da ich keine Dokumentation über die genaue Menge der unterstützten Zeichen finden konnte, aber Sie sollten wahrscheinlich Steuerzeichen, seltsame unsichtbare Kombinationszeichen, Zeichen für den privaten Gebrauch und Ähnliches vermeiden.

Bewertungsrubrik

Als allgemeiner Leitfaden für die Einstufung von Lösungen bei der Auswahl der von mir akzeptierten Lösung kann man sagen, dass ich die Lösungen wahrscheinlich auf einer 25-Punkte-Skala bewerten werde (dies ist sehr grob und ich werde nichts direkt bewerten, sondern dies nur als grundlegende Richtlinie verwenden):

  • 15 Punkte dafür, wie gut das Kodierungsschema eine breite Palette von Eingangsbildern wiedergibt. Dies ist ein subjektives, ästhetisches Urteil
    • 0 bedeutet, dass es überhaupt nicht funktioniert, sondern jedes Mal dasselbe Bild zurückgegeben wird, oder so ähnlich
    • 5 bedeutet, dass es ein paar Bilder kodieren kann, obwohl die dekodierte Version hässlich aussieht und bei komplizierteren Bildern möglicherweise gar nicht funktioniert
    • 10 bedeutet, dass es bei einer Vielzahl von Bildern funktioniert und angenehm aussehende Bilder erzeugt, die gelegentlich unterscheidbar sein können
    • 15 bedeutet, dass es perfekte Repliken einiger Bilder erzeugt und selbst bei größeren und komplexeren Bildern etwas Erkennbares liefert. Oder sie erzeugt vielleicht keine Bilder, die gut erkennbar sind, aber sie erzeugt schöne Bilder, die eindeutig vom Original abgeleitet sind.
  • 3 Punkte für die geschickte Verwendung des Unicode-Zeichensatzes
    • 0 Punkte für die einfache Verwendung aller zulässigen Zeichen
    • 1 Punkt für die Verwendung einer begrenzten Anzahl von Zeichen, die sicher über Twitter oder in einer größeren Anzahl von Situationen übertragen werden können
    • 2 Punkte für die Verwendung einer thematischen Untergruppe von Zeichen, z. B. nur Han-Ideogramme oder nur Zeichen von rechts nach links
    • 3 Punkte für etwas wirklich Tolles, wie das Erstellen von lesbarem Text oder die Verwendung von Zeichen, die wie das betreffende Bild aussehen
  • 3 Punkte für clevere algorithmische Ansätze und Code-Stil
    • 0 Punkte für etwas, das 1000 Zeilen Code umfasst, nur um das Bild zu verkleinern, es als 1 Bit pro Pixel zu behandeln und es mit base64 zu kodieren
    • 1 Punkt für etwas, das eine Standardkodierungstechnik verwendet und gut und kurz geschrieben ist
    • 2 Punkte für etwas, das eine relativ neue Kodierungstechnik einführt oder das überraschend kurz und sauber ist
    • 3 Punkte für einen One-Liner, der tatsächlich gute Ergebnisse liefert, oder etwas, das bei der Grafikkodierung Neuland betritt (falls dies als geringe Punktzahl für Neuland erscheint, bedenke, dass ein so gutes Ergebnis wahrscheinlich auch eine hohe Punktzahl für die Ästhetik hat)
  • 2 Punkte für Geschwindigkeit. Alles andere ist gleich, schneller ist besser, aber die oben genannten Kriterien sind alle wichtiger als Geschwindigkeit
  • 1 Punkt für die Ausführung auf freier (quelloffener) Software, da ich freie Software bevorzuge (beachten Sie, dass C# weiterhin für diesen Punkt in Frage kommt, solange es auf Mono läuft, ebenso wie MATLAB-Code in Frage kommt, wenn er auf GNU Octave läuft)
  • 1 Punkt für die tatsächliche Einhaltung aller Regeln. Die Regeln sind etwas umfangreich und kompliziert geworden, daher werde ich wahrscheinlich auch ansonsten gute Antworten akzeptieren, bei denen ein kleines Detail falsch ist, aber ich gebe einen Extrapunkt für jede Lösung, die tatsächlich alle Regeln befolgt

Referenzbilder

Einige Leute haben um einige Referenzbilder gebeten. Hier sind ein paar Referenzbilder, die Sie ausprobieren können. Kleinere Versionen sind hier eingebettet, sie sind alle mit größeren Versionen des Bildes verlinkt, falls Sie diese benötigen:

Lena Mona Lisa Cornell Box StackOverflow Logo

Preis

Ich biete eine 500 Wiederholungsprämien (plus die 50, die StackOverflow beisteuert) für die Lösung, die mir auf der Grundlage der oben genannten Kriterien am besten gefällt. Natürlich ermutige ich alle anderen, hier ebenfalls für ihre Lieblingslösungen zu stimmen.

Hinweis zur Frist

Der Wettbewerb läuft, bis das Kopfgeld aufgebraucht ist, etwa am Samstag, den 30. Mai um 18 Uhr. Ich kann nicht genau sagen, wann es enden wird; es kann zwischen 17 und 19 Uhr sein. Ich garantiere, dass ich mir alle bis 14 Uhr eingereichten Beiträge ansehe, und ich werde mein Bestes tun, um mir alle bis 16 Uhr eingereichten Beiträge anzusehen; wenn Lösungen danach eingereicht werden, habe ich möglicherweise keine Chance, sie angemessen zu prüfen, bevor ich meine Entscheidung treffen muss. Je früher Sie Ihren Beitrag einreichen, desto größer ist die Chance, dass Sie an der Abstimmung teilnehmen und mir helfen, die beste Lösung zu finden.

Unicode-Hinweise

Es hat auch einige Verwirrung darüber gegeben, welche Unicode-Zeichen genau erlaubt sind. Der Bereich der möglichen Unicode-Codepunkte ist U+0000 a U+10FFFF . Es gibt einige Codepunkte, die niemals als Unicode-Zeichen in einem offenen Datenaustausch verwendet werden dürfen; dies sind die Nicht-Zeichen und die Surrogat-Codepunkte . Nicht-Zeichen werden im Abschnitt Unidode Standard 5.1.0 Abschnitt 16.7 als die Werte U+FFFE , U+FFFF , U+ n FFFE , U+ n FFFF wobei n es 1 - 10 hexadezimal, und der Bereich U+FDD0 - U+FDEF . Diese Werte sind für die anwendungsspezifische interne Verwendung vorgesehen, und konforme Anwendungen können diese Zeichen aus dem von ihnen verarbeiteten Text entfernen. Surrogat-Codepunkte, definiert in der Datei Unicode Standard 5.1.0 Abschnitt 3.8 als U+D800 - U+DFFF werden für die Kodierung von Zeichen jenseits der Basic Multilingual Plane in UTF-16 verwendet; daher ist es unmöglich, diese Codepunkte direkt in der UTF-16-Kodierung darzustellen, und es ist ungültig, sie in irgendeiner anderen Kodierung zu kodieren. Daher lasse ich für diesen Wettbewerb jedes Programm zu, das Bilder in eine Sequenz von nicht mehr als 140 Unicode-Codepunkten aus dem Bereich U+0000 - U+10FFFF mit Ausnahme aller Nicht-Zeichen und Surrogatpaare, wie oben definiert.

Ich werde lieber Lösungen, die nur zugewiesene Zeichen verwenden, und noch bessere Lösungen, die clevere Untermengen zugewiesener Zeichen verwenden oder etwas Interessantes mit dem verwendeten Zeichensatz anstellen. Eine Liste der zugewiesenen Zeichen finden Sie in der Unicode-Zeichen-Datenbank Beachten Sie, dass einige Zeichen direkt aufgeführt sind, während andere nur als Anfang und Ende eines Bereichs aufgeführt sind. Beachten Sie auch, dass Ersatzcodepunkte in der Datenbank aufgeführt sind, aber wie oben erwähnt verboten sind. Wenn Sie bestimmte Eigenschaften von Zeichen nutzen möchten, um den von Ihnen ausgegebenen Text interessanter zu gestalten, gibt es eine eine Vielzahl von Datenbanken mit Zeicheninformationen verfügbar, wie zum Beispiel ein Liste der benannten Codeblöcke y verschiedene Zeicheneigenschaften .

Da Twitter den genauen Zeichensatz, den es unterstützt, nicht angibt, werde ich nachsichtig mit Lösungen sein, die mit Twitter nicht funktionieren, weil bestimmte Zeichen extra zählen oder bestimmte Zeichen entfernt werden. Es ist wünschenswert, aber nicht erforderlich, dass alle kodierten Ausgaben unversehrt über Twitter oder einen anderen Microblogging-Dienst wie identi.ca . Ich habe einige Dokumentationen gesehen, die besagen, dass Twitter <, > und & verschlüsselt und somit als 4, 4 bzw. 5 Zeichen zählt, aber ich habe das nicht selbst getestet, und ihr JavaScript-Zähler scheint sie nicht auf diese Weise zu zählen.

Tipps und Links

  • Die Definition der gültigen Unicode-Zeichen in den Regeln ist ein wenig kompliziert. Die Auswahl eines einzelnen Zeichenblocks, wie z. B. CJK Unified Ideographs (U+4E00-U+9FCF), ist möglicherweise einfacher.
  • Sie können vorhandene Bildbibliotheken verwenden, wie ImageMagick o Python Bildgebungsbibliothek für Ihre Bildmanipulation.
  • Wenn Sie Hilfe benötigen, um den Unicode-Zeichensatz und seine verschiedenen Kodierungen zu verstehen, lesen Sie diese Kurzanleitung o diese ausführliche FAQ zu UTF-8 unter Linux und Unix .
  • Je früher Sie Ihre Lösung einreichen, desto mehr Zeit haben ich (und andere Abstimmende), sie zu prüfen. Sie können Ihre Lösung bearbeiten, wenn Sie sie verbessern wollen. Ich werde meine Prämie auf der Grundlage der aktuellsten Version berechnen, wenn ich die Lösungen zum letzten Mal durchsehe.
  • Wenn Sie ein einfach zu parsendes und zu schreibendes Bildformat wünschen (und nicht einfach ein bestehendes Format verwenden wollen), würde ich vorschlagen, dass Sie die PPM-Format . Es handelt sich um ein textbasiertes Format, das sehr einfach zu handhaben ist, und Sie können ImageMagick für die Konvertierung in und aus ihm.

0 Stimmen

Fühlt euch frei, Vorschläge zu den Regeln zu machen, die ich in den Kommentaren aufgeschrieben habe. Ich bin gerne bereit, sie zu ändern, wenn jemand meint, dass sie einer Klärung bedürfen oder zu sehr spezifiziert sind.

6 Stimmen

Sie sollten vielleicht sagen, dass das Hochladen des Bildes auf einen Server und das Posten der URL dazu nicht gültig ist.

2 Stimmen

@Shay Habe ich das nicht schon gesagt? "Der Dekodierungsprozess darf keinen Zugriff auf eine andere Ausgabe des Kodierungsprozesses haben als die oben angegebene; das heißt, Sie können das Bild nicht irgendwo hochladen und die URL ausgeben, damit der Dekodierungsprozess es herunterladen kann, oder irgendetwas Dummes in dieser Art."

20voto

Okay, ich bin spät dran, aber ich habe mein Projekt trotzdem gemacht.

Es handelt sich um einen genetischen Spielzeugalgorithmus, der durchsichtige bunte Kreise verwendet, um das Ausgangsbild neu zu erstellen.

Merkmale:

  • reines Lua. Läuft überall, wo ein Lua-Interpreter läuft.
  • verwendet das netpbm P3-Format
  • kommt mit einer umfassenden Suite von Unit-Tests
  • behält die ursprüngliche Bildgröße bei

Mis-feautres:

  • langsam
  • Bei dieser räumlichen Beschränkung bleibt nur das grundlegende Farbschema des Ausgangsbildes und ein allgemeiner Umriss einiger weniger Merkmale des Bildes erhalten.

Hier ist ein Beispiel für einen Twit, der Lena repräsentiert:

original lena encoded Lena

Der Code befindet sich in einem Mercurial-Repository bei bitbucket.org. Ausprobieren http://bitbucket.org/tkadlubo/circles.lua

19voto

rjzii Punkte 13932

Ich muss zugeben, dass die Arbeit an diesem Projekt sehr interessant war, da es definitiv außerhalb meines normalen Arbeitsbereichs liegt und ich etwas Neues gelernt habe.

Der Grundgedanke meiner Arbeit ist der folgende:

  1. Herunterrechnen der Graustufen des Bildes, so dass insgesamt 16 verschiedene Farbtöne entstehen
  2. RLE für das Bild vorbereiten
  3. Packen Sie die Ergebnisse in die UTF-16-Zeichen
  4. RLE für die gepackten Ergebnisse vorbereiten, um doppelte Zeichen zu entfernen

Es stellt sich heraus, dass dies tatsächlich funktioniert, allerdings nur in begrenztem Umfang, wie Sie an den Beispielbildern unten sehen können. Was die Ausgabe betrifft, so folgt nun ein Beispiel-Tweet, speziell für das in den Beispielen gezeigte Lena-Bild.

2328353253425

Wie Sie sehen können, habe ich versucht, den Zeichensatz ein wenig einzuschränken; dabei bin ich jedoch auf Probleme bei der Speicherung der Farbdaten gestoßen. Außerdem neigt dieses Kodierungsschema dazu, eine Reihe von Datenbits zu verschwenden, die für zusätzliche Bildinformationen verwendet werden könnten.

Was die Laufzeiten angeht, so ist der Code für kleine Bilder extrem schnell, etwa 55 ms für die bereitgestellten Beispielbilder, aber die Zeit steigt mit größeren Bildern. Für das 512x512 Lena-Referenzbild betrug die Laufzeit 1182ms. Ich sollte anmerken, dass die Chancen ziemlich gut stehen, dass der Code selbst nicht sehr auf Leistung optimiert ist (z.B. wird alles als Bitmap ), so dass die Zeiten nach einer Überarbeitung ein wenig sinken könnten.

Bitte machen Sie mir Vorschläge, was ich hätte besser machen können oder was an dem Code falsch sein könnte. Die vollständige Auflistung der Laufzeiten und der Beispielausgaben finden Sie unter der folgenden Adresse: http://code-zen.info/twitterimage/

Update Eins

Ich habe den RLE-Code aktualisiert, der bei der Komprimierung der Tweet-Zeichenfolge verwendet wird, um einen grundlegenden Rückblick zu machen und wenn ja, diesen für die Ausgabe zu verwenden. Dies funktioniert nur für die Zahlen-Wert-Paare, aber es spart ein paar Zeichen an Daten. Die Laufzeit ist mehr oder weniger die gleiche wie die Bildqualität, aber die Tweets sind tendenziell etwas kleiner. Ich werde die Tabelle auf der Website aktualisieren, sobald ich die Tests abgeschlossen habe. Es folgt einer der Beispiel-Tweetstrings, wieder für die kleine Version von Lena:

238524

Update Zwei

Ein weiteres kleines Update, aber ich habe den Code geändert, um die Farbtöne in Dreiergruppen statt in Vierergruppen zu packen. Das verbraucht etwas mehr Platz, aber wenn ich nichts übersehe, sollte es bedeuten, dass "ungerade" Zeichen nicht mehr dort erscheinen, wo die Farbdaten sind. Außerdem habe ich die Komprimierung ein wenig aktualisiert, so dass sie jetzt auf die gesamte Zeichenkette und nicht nur auf den Farbzählblock wirkt. Ich bin noch dabei, die Laufzeiten zu testen, aber sie scheinen nominell verbessert zu sein; die Bildqualität ist jedoch immer noch die gleiche. Was folgt, ist die neueste Version des Lena-Tweets:

2238524

StackOverflow-Logo 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

15voto

CiscoIPPhone Punkte 9336

Dieser genetische Algorithmus, den Roger Alsing geschrieben hat, hat eine gute Kompressionsrate, allerdings auf Kosten langer Kompressionszeiten. Der resultierende Vektor von Scheitelpunkten könnte mit einem verlustbehafteten oder verlustfreien Algorithmus weiter komprimiert werden.

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

Es wäre ein interessantes Programm, aber ich lasse es ausfallen.

12voto

Quasimondo Punkte 2395

In der ursprünglichen Herausforderung ist die Größenbeschränkung als das definiert, was Twitter noch erlaubt, wenn Sie Ihren Text in das Textfeld einfügen und auf "Aktualisieren" drücken. Wie einige Leute richtig bemerkt haben, unterscheidet sich dies von dem, was man als SMS-Textnachricht von seinem Handy aus senden kann.

Was nicht explizit erwähnt wird (was aber meine persönliche Regel war), ist, dass Sie in der Lage sein sollten, die getwitterte Nachricht in Ihrem Browser auszuwählen, sie in die Zwischenablage zu kopieren und in ein Texteingabefeld Ihres Decoders einzufügen, damit er sie anzeigen kann. Es steht Ihnen natürlich auch frei, die Nachricht als Textdatei zu speichern und wieder einzulesen oder ein Tool zu schreiben, das auf die Twitter-API zugreift und alle Nachrichten herausfiltert, die wie ein Bildcode aussehen (gibt es spezielle Marker? augenzwinkernd augenzwinkernd ). Aber die Regel ist, dass die Nachricht Twitter durchlaufen haben muss, bevor man sie entschlüsseln darf.

Viel Glück mit den 350 Bytes - ich bezweifle, dass Sie sie nutzen können.

12voto

Gineer Punkte 2290

Das Einstellen eines Schwarzweiß- oder Graustufenbildes sollte die Größe des Bildes verbessern, das in diesem Bereich kodiert werden kann, da Sie sich nicht um die Farbe kümmern.

Möglicherweise kann man die Aufgabe erweitern, indem man drei Bilder hochlädt, die, wenn sie neu kombiniert werden, ein volles Farbbild ergeben, während in jedem einzelnen Bild noch eine Schwarzweißversion erhalten bleibt.

Fügen Sie etwas Kompression zu den oben genannten und es könnte beginnen, lebensfähig aussehen ...

Toll!!! Jetzt habt ihr mein Interesse geweckt. Für den Rest des Tages wird es keine Arbeit mehr geben...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X