Suche
Die digitale Geheimtinte für Android

Android Watermark: Eine leichtgewichtige Bibliothek zum Erstellen digitaler Wasserzeichen

Yizheng Huang

© Shutterstock / SilverCircle

Immer mehr Leute laden eigene Bilder im Web hoch. Selten sind die eigenen Aufnahmen dabei geschützt und damit digitalem Bilderdiebstahl ausgesetzt. Eine beliebte Kopierschutzmaßnahme sind in dem Zusammenhang digitale Wasserzeichen. Um das Herstellen von Wasserzeichen zu vereinfachen, habe ich Android WaterMark entwickelt – eine leichtgewichtige Bibliothek für digitale Wasserzeichen, die verschlüsselte und unsichtbare Wasserzeichen unterstützt.

In meiner Freizeit nutze ich gerne mein Handy, um Nachrichten und witzige Posts zu lesen. Dabei ist mir schon häufiger aufgefallen, dass in vielen mobilen Apps Nachrichtenbilder und hochgeladene Bilder von Usern mit digitalen Wasserzeichen versehen sind. Heute, im Zeitalter des Datenschutzes und des Urheberrechts, sind Wasserzeichen eine wirklich gute Methode, um seine Persönlichkeitsrechte zu schützen. Aktuell erstellen Entwickler Wasserzeichen selbst und so kam ich auf die Idee, eine Bibliothek zu bauen, die Entwickler bei dieser Arbeit unterstützt.

Was daraus folgte war Android WM, eine leichtgewichtige Android-Wasserzeichenbibliothek, die unsichtbare digitale Wasserzeichen unterstützt.

Digitale Wasserzeichen – Watermark Text und Watermark Image

Der erste Schritt beim Aufbau dieses Frameworks war das Schreiben des Codes, der dem Hintergrundbild ein Text-Wasserzeichen hinzufügen kann. Um den Nutzern eine möglichst reibungslose Arbeit zu ermöglichen und flexible Schnittstellen zu bieten, habe ich den Factory-Modus verwendet. Dieser ist im Android-WM-Projekt besonders hilfreich, da das Text-Wasserzeichen über viele Eigenschaften verfügt, die vor dem Zeichnen festgelegt werden müssen (z.B. die Position oder die Größe des Wasserzeichens). Der Factory-Modus verzichtet auf die Verwendung vieler Java-Konstruktoren und kann das Einstellen der Attribute komfortabler und übersichtlicher gestalten.

Möchte man Android WM verwenden, um ein sichtbares Wasserzeichen zu zeichnen, kann man diese Bibliothek dem eigenen Android-Projekt durch Gradle hinzufügen:

implementation 'com.huangyz0918:androidwm:0.1.9'

Nachdem die Vorbereitung abgeschlossen ist, benötigt man einen WatermarkBuilder, um ein Bild mit Wasserzeichen zu erstellen. Dafür kann man eine Instanz der create-Methode des WatermarkBuilder abrufen, muss aber zunächst ein Bitmap oder eine int-Ressource (die drawable sein muss) als Hintergrundbild setzen.

WatermarkBuilder

            .create(context, backgroundBitmap)

            .loadWatermarkText(watermarkText)
 
           .getWatermark()

            .setToImageView(imageView);

Das Bild-Wasserzeichen wird auf dieselbe Weise erstellt und ist ebenfalls leicht zu benutzen.

So wird’s gemacht!

Das Erstellen der sichtbaren Wasserzeichen im Hintergrundbild ist keine schwierige Aufgabe, sowohl die Text-Wasserzeichen als auch die Bild-Wasserzeichen werden mittels Canvas auf das Hintergrundbild gezeichnet. Ich habe die Zeichenmethoden versiegelt, den Entwicklern dann eine einfach aufrufbare Schnittstelle im Package zur Verfügung gestellt und somit die erste Version der Open-Source-Bibliothek fertiggestellt.

Allerdings wollte ich hier nicht aufhören. Schließlich gibt es viele Leute, die gerne das Urheberrecht verletzen, indem sie Wasserzeichen zerstören. Aus diesem Grund wurde es notwendig in einigen Fällen unsichtbare Wasserzeichen zu erstellen. Und da ich die beste Android Wasserzeichenbibliothek erstellen möchte, kann ich auf die unsichtbaren Wasserzeichen nicht verzichten. Das Zeichnen der unsichtbaren digitalen Wasserzeichen ist jedoch keine leichte Aufgabe.

API Summit 2018
Christian Schwendtner

GraphQL – A query language for your API

mit Christian Schwendtner (PROGRAMMIERFABRIK)

DDD Summit 2018
Nicole Rauch

Domain-Driven Design für Einsteiger

mit Nicole Rauch (Softwareentwicklung und Entwicklungscoaching)

Unsichtbare Wasserzeichen

Gängige Implementierungsmethoden, die derzeit im Bereich des Verbergens von Informationen eingesetzt werden, sind:

  1. Zeichnen eines LSB-Wasserzeichens in der räumlichen Domäne.
  2. Zeichnen eines versteckten Wasserzeichens im Frequenzbereich.

Android WM beinhaltet die Methoden zum Erstellen der LSB-Wasserzeichen bereits, aber die Methoden, die Wasserzeichen in den Frequenzbereich zeichnen, befinden sich noch in der Entwicklung.

Least Significant Bits

LSB steht für Least Significant Bits. Bei diesem Verfahren werden unsere versteckten Informationen (Wasserzeichen) in einigen der am wenigsten signifikanten Bits im Bild gespeichert. Die LSB-Methode ist der einfachste Weg, um die Wasserzeichen einzubetten.

Tatsächlich hat jedes Bild eine gewisse Rauschverträglichkeit. Das zeigt sich darin, dass die LSBs der Pixeldaten wenig visuelle Auswirkungen auf das menschliche Auge haben. Das menschliche Auge kann die subtilen Veränderungen, die eine Änderung der Endziffer einer RGB-Farbe (Red, Green, Blue) mit sich bringt, im einzelnen Pixel kaum unterscheiden. So können die geheimen Informationen in der untersten oder unteren Ordnung jedes Pixels versteckt werden, wodurch das Wasserzeichen verschwunden scheint.

Um unser unsichtbares LSB-Wasserzeichen zu implementieren, extrahiert Android WM alle Pixel des Hintergrundbilds, von denen jedes in einen 4-Bit-ARGB-Integer (alpha, red, green, blue) zerlegt werden kann bei dem jedes ARGB-Element durch eine Integer-Nummer von 0 bis 255 dargestellt wird. Das menschliche Auge kann die kleine Änderung der letzten Bitabstufung überhaupt nicht erkennen. Auf diese Weise können wir die Text- (oder Bild)-Informationen des Wasserzeichens in eine Kette von Binärzeichen  kodieren. Nach dem Kodieren löschen wir das letzte Bit jedes ARGB-Wertes und ersetzen es durch die Binärzeichen, womit wir die Last-Bit-Graduierung nutzen können, um unser verstecktes Wasserzeichen zu speichern.

Das Erkennen eines unsichtbaren Wasserzeichens

Um die unsichtbaren LSB-Wasserzeichen zu erkennen, müssen wir nur die Botschaft im letzten Bit jedes ARGB-Wertes lesen und zusammensetzen. Das LSB-Prinzip lässt sich anhand des folgenden Bildes erklären:

Jetzt kann man das unsichtbare LSB-Wasserzeichen von Android WM ausprobieren. Wie bei den normalen Wasserzeichen benötigt man zuerst einen WatermarkBuilder: Dazu ruft man .setInvisibleWMListener auf, um das Wasserzeichenbild zu zeichnen:

WatermarkBuilder

            .create(this, backgroundBitmap)

            .loadWatermarkImage(watermarkBitmap)

            .setInvisibleWMListener(true, new BuildFinishListener<Bitmap>() {

                @Override

                public void onSuccess(Bitmap object) {

                     // do something...

                }



                @Override

                public void onFailure(String message) {

                   // do something...

                }

            });

Im eigentlichen Projekt fügt Android WM nicht-binäre Suffixe hinzu, um die binären Informationen des Wasserzeichens zu identifizieren. Gleichzeitig markiert unser Algorithmus zyklisch die Informationen des Wasserzeichens, um das gesamte Bild mit dem Wasserzeichen zu versehen. Im Hintergrundbild platziert kann es erfolgreich erkannt werden, solange das Bild eine gültige Wasserzeicheninformation enthält. Möchte man LSB-Wasserzeichen erkennen, kann man dazu einen WatermarkDetector verwenden. Für spezielle Verwendungen habe ich eine Dokumentation geschrieben, die auf GitHub liegt. Die Demo des unsichtbaren LSB-Wasserzeichens sieht so aus:

Digitale LSB-Wasserzeichen in der räumlichen Domäne haben folgende Vorteile:

  • Sehr viele Wasserzeicheninformationen werden unterstützt
  • Geringer Einfluss auf das Originalbild
  • Einfacher Algorithmus

Anderseits gibt es auch große Nachteile, die nicht ignoriert werden dürfen:

  • Da das digitale Wasserzeichen in die räumliche Domäne gezeichnet wird, wird das Bild zerstört, sobald es sich ändert
  • Schlechte Widerstandsfähigkeit: Beschneiden, Skalieren und die JPG-Komprimierung zerstören das Wasserzeichen.

Ausblick

Im nächsten Schritt möchte ich den Code in C++ umschreiben, wodurch die Zeichen- und Erkennungsgeschwindigkeit der unsichtbaren Wasserzeichen erheblich beschleunigt werden kann. Zudem möchte ich versuchen, die unsichtbaren Wasserzeichen im Frequenzbereich zu implementieren, da diese (im Gegensatz zu LSB-Wasserzeichen) eine bessere Widerstandsfähigkeit besitzen.

Verwandte Themen:

Geschrieben von
Yizheng Huang
Yizheng Huang
Yizheng Huang ist in seinem Juniorjahr am EECS-Bachelorprogramm der ShanDong University, China. Er hat einige erfolgreiche Web- und Android-Anwendungen entwickelt und ist in einigen Open-Source-Communities aktiv. Seine Forschungsinteressen liegen aktuell in den Bereichen Kryptographie und Softwaretests.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: