簡體   English   中英

ImageMagick / Imagick:將具有Alpha通道的PNG轉換為2色圖像(彩色,透明)

[英]ImageMagick / Imagick: Convert a PNG with Alpha channel into a 2 color image (Color, Transparent)

我想知道並找出如何着色/替換不透明像素不完全透明的圖像像素。

例如,如果有一個帶有透明像素的彩色徽標,我想將其轉換為僅具有#ff0000顏色的徽標,而不更改透明背景。

我想用PHP Imagick庫來實現。 我找不到任何好的文檔。

我以為Imagick :: thresholdImage將是一個幫手,但是沒有關於threshold參數的文檔。

使用這段代碼可以達到最佳效果。 但是仍然無法完美運行。 一些像素-我猜不替換那些alpha> 0和<1的像素。

$image = new \Imagick($source);
$image->setImageFormat('png');

$fill = new \ImagickPixel('#ff0000');
$image->thresholdImage(0);
$image->paintOpaqueImage('#ffffff', $fill, 1);

$image->writeImage($destination);

我想知道並找出如何着色/替換不透明像素不完全透明的圖像像素。

您幾乎可以肯定不會。

下面的代碼滿足您的要求(我認為),並且輸出看起來很糟糕。 也許您應該給出在Photoshop中編輯過的示例輸入圖像和希望的示例輸出圖像,以顯示所需的內容。

輸入圖片:

在此處輸入圖片說明

輸出圖像:

在此處輸入圖片說明

$imagick = new Imagick("fnord.png");

// Get the alpha channel of the original image.
$imagick->separateImageChannel(\Imagick::CHANNEL_ALPHA);

// Make all the colors above this pure white.
$imagick->whiteThresholdImage("rgb(254, 254, 254)");

// Make all the colors below this pure black.
$imagick->blackThresholdImage("rgb(254, 254, 254)");

// We want the mask the other way round
$imagick->negateImage(false);

$imagickCanvas = new \Imagick();

$imagickCanvas->newPseudoImage(
    $imagick->getImageWidth(),
    $imagick->getImageHeight(),
    "xc:rgb(255, 0, 0)"
);

// Copy the mask back as the alpha channel.
$imagickCanvas->compositeImage($imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// Write out the image.
$imagickCanvas->setImageFormat('png');
$imagickCanvas->writeImage("./output.png");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM