如何恢复使用 Imagick::steganoImage() 设置的水印

how to restore the watermark set with Imagick::steganoImage()

所以我使用了这个用 PHP 编写的 Imagemagick 库包装器,并开始了解名为 steganoImage() 的 this 函数,它简单地说它将在图像中隐藏水印。但问题是文档没有说明如何恢复该图像。我也检查了所有其他功能,没有找到任何东西。我想为此提供一个 Imagick 解决方案。

在你花很多时间之前,你需要你用来创建秘密图像的原始维度来检索它。因此,如果图像被裁剪、调整大小或格式更改,您可能无法检索到消息。

供您参考,这是一个提供 Imagick 示例的好网站:https://phpimagick.com/Imagick/queryFormats 虽然他们没有提到 steganoImage()

我在网上找到了下面的代码(Codesearch),它适用于 IMagick:

#!/usr/bin/perl

use Image::Magick;

#
# Hide an image within an image
#
$watermark=Image::Magick->new;
$watermark->ReadImage('smile.gif');
($width, $height)=$watermark->Get('width','height');
#
# Hide image in image.
#
$image=Image::Magick->new;
$image->ReadImage('model.gif');
$image->SteganoImage(image=>$watermark,offset=>91);
$image->Write('model.png');
$image->Write('win:');
#
# Extract image from image.
#
$size="$width" . "x" . "$height" . "+91";
$stegano=Image::Magick->new(size=>$size);
$stegano->ReadImage('stegano:model.png');
$stegano->Write('stegano.gif');
$stegano->Write('win:');

Bonzo 提供的答案是正确的。 PHP 的 Imagick 中的示例看起来非常相似。

$image = new Imagick('rose:');
$watermark = new Imagick('label:Hello World!');

// The decoding process must "know" about the watermarks size, and starting
// pixel offset.
define('STEGANO_OFFSET', 64); // Secret offset
define('STEGANO_WIDTH', $watermark->getImageWidth());
define('STEGANO_HEIGHT', $watermark->getImageHeight());

$stegano = $image->steganoImage($watermark, STEGANO_OFFSET);
$stegano->writeImage('output.png');

要解码原始水印,请在读取文件之前定义隐藏图像的宽度、高度和偏移量。

$decoded = new Imagick();
$decoded->setSizeOffset(STEGANO_WIDTH, STEGANO_HEIGHT, STEGANO_OFFSET);
$decoded->readImage('STEGANO:output.png');
$decoded->writeImage('decoded.png');