【问题标题】:Imagick::steganoImage() Unable to show the watermarkImagick::steganoImage() 无法显示水印
【发布时间】:2020-09-25 16:42:32
【问题描述】:

我正在尝试将 Imagick::steganoImage 与来自 wikimedia commons 的示例图像一起使用。 如果我尝试显示水印的解码图像,我总是会获得你可以在下面看到的 1 像素图像,无论我选择什么图像作为源。 任何人都可以帮助我理解为什么以及如何解决这个问题?

<?
header("Content-Type: image/png");   
// Create a new imagick object 
$image = new Imagick('https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Frostedbubble2.jpg/640px-Frostedbubble2.jpg'); 
$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');

// Show the output 
$decoded->setImageFormat('png'); 
echo $decoded->getImageBlob(); 
?> 

我还尝试了此页面上的代码https://www.geeksforgeeks.org/php-imagick-steganoimage-function/,并且 geeksforgeeks 图像正确显示,但隐写图像显示为全黑。

<?php 

// Create a new imagick object 
$imagick = new Imagick( 
'https://media.geeksforgeeks.org/wp-content/uploads/geeksforgeeks-13.png'); 

// Create another Imagick object containing watermark 
$watermark = new Imagick('label:This is my secret.'); 

// Hide $watermark inside $imagick 
$imagick = $imagick->steganoImage($watermark, 64); 

// Write image to the local folder 
$imagick->writeImage('output.png'); 

// Set the offset 
$imagick->setSizeOffset($watermark->getImageWidth(), 
                   $watermark->getImageHeight(), 64); 

// Read the encoded image and extract secret 
$imagick->readImage('STEGANO:output.png'); 

// Show the output 
$imagick->setImageFormat('png'); 
header("Content-Type: image/png"); 
echo $imagick->getImageBlob(); 
?>

【问题讨论】:

    标签: imagick steganography


    【解决方案1】:

    看起来new Imagick('LABEL:Hello World!'); 不再适合简单的标签。您需要在阅读标签之前设置画布的大小和磅值。

    define('STEGANO_OFFSET', 64); // Secret offset
    define('STEGANO_WIDTH', 88);
    define('STEGANO_HEIGHT', 14);
    
    $watermark = new Imagick();
    $watermark->setSize(STEGANO_WIDTH, STEGANO_HEIGHT);
    $watermark->setPointSize(16);
    $watermark->readImage('LABEL:Hello World!');
    
    $stegano = $image->steganoImage($watermark, STEGANO_OFFSET);
    

    我不知道何时/为什么会发生这种变化,但如果您运行以下...

    convert 'label:Hello World!' decoded.png
    

    ...您将获得之前从STEGANO: 提取的相同图像

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2016-11-15
      相关资源
      最近更新 更多