Одним из способов защиты авторских прав на изображения является применение водяных знаков. Большинство фотостоков пользуются этим: на сайте размещается изображение, «подпорченное» водяными знаками, а оригинал отправляют только после покупки. Однако у этого способа есть уязвимости.
Альтернативным способом защиты прав может быть скрытая стеганографическая подпись. Она не мешает нелегально использовать изображение, но зато поможет доказать авторство. Подпись хорошо защищает оригинал, но не сохраняется при большинстве способов обработки (размытие, обрезание). Эту проблему решил пользователь mchall на GitHub.
Проект HiddenWatermark (скрытый водяной знак) умеет встраивать скрытую подпись в изображение. В основе лежит алгоритм DWT-DCT, который устойчив к большинству методов обработки. Подписью является бинарное изображение с разрешением 32 на 32 пикселя.
Использование
Проект написан на языке C#. Ниже приведён пример, в котором используется стандартная подпись.
// Считываем оригинальное изображение
var fileBytes = File.ReadAllBytes(imageLocation);
// Получаем новое изображение с внедрённым водяным знаком
var newFileBytes = Watermark.Default.EmbedWatermark(fileBytes);
// Извлекаем подпись из файла
var result = Watermark.Default.RetrieveWatermark(newFileBytes);
В следующем примере показано создание изображения с подписью, заданной пользователем.
// Считываем подпись из файла
var watermarkBytes = File.ReadAllBytes(watermarkLocation);
// Инициализируем класс с нашей подписью (с защитой от обрезания изображения)
Watermark watermark = new Watermark(watermarkBytes, true);
// Считываем наше изображение
var fileBytes = File.ReadAllBytes(imageLocation);
// Внедряем подпись с проверкой на уже существующую
var result = watermark.RetrieveAndEmbedWatermark(fileBytes);
Стойкость при обработке
Как уже было сказано выше, в отличии от стеганографических методов, подпись сохраняется при большинстве способов обработки (любых, кроме перевода в оттенки серого).
Больше информации можно найти в репозитории на GitHub.