PHP: Imagick: Merge Transparent Image - php

I want to merge a transparent PNG into another Image, but the Border of the PNG will not change to Transparent as a want.
<?
$s1= new Imagick('img.jpg');
$s2= new Imagick('img2.jpg');
$s2->setImageFormat ('png');
$s2->vignetteImage(20, 20, 40, - 20);
$s2->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$s1->compositeImage($s2, Imagick::COMPOSITE_DEFAULT,120,120, Imagick::CHANNEL_ALPHA);

You just need to set the background to transparent on the original JPEG image.
<?
$s1= new Imagick('img.jpg');
$s2= new Imagick('img2.jpg');
$s2->setImageFormat ('png');
$s2->setImageBackgroundColor("transparent"); // <= Here
$s2->vignetteImage(20, 20, 40, - 20);
$s2->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$s1->compositeImage($s2, Imagick::COMPOSITE_DEFAULT,120,120, Imagick::CHANNEL_ALPHA);
If there's still issues, it might be worth ensuring the alpha channel of the PNG is enabled.
$s2->setImageMatte(TRUE);

Related

php merge transparent png image to jpeg preventing the white background

I have successfully merged a png image to a jpeg background using the php GD library however I would like the png image to have a transparent background yet a white background is constantly displayed as shown below:
I have looked at a few posts to fix this issue and tried different methods of implementation all in vain, any suggestions as to what I should add or do?
Here is my code:
<?php
$background = imagecreatefromjpeg('img3.jpg');
$bird = imagecreatefrompng('img4.png');
$bird_x = imagesx($bird);
$bird_y = imagesy($bird);
imagesavealpha($bird, true);
$color = imagecolorallocatealpha($bird, 0, 0, 0, 127);
imagefill($bird, 0, 0, $color);
if (imagecopymerge($background, $bird, 0, 0, 0, 0, $bird_x, $bird_y, 100))
{
header('Content-Type: image/jpeg');
imagejpeg($background);
imagedestroy($bird);
}
else
{
header('Content-Type: text/html');
echo "Failed to Merge images!";
}
?>
Use imagecopy
imagecopy($dest_image, $src, ($offset + 250), $offset, 0, 0, imagesx($src),imagesy($src));
I guess the specified behavior is by design.
imagecopymerge merges N% of pixels of the source image with (100-N)% of pixels from the destination image. From this definition it would be logical to assume that you won't see any of the background image pixels in the area where you've copied the bird (which is the full rectangle). Hence the white pixels instead of alpha.
Try imagecopy or imagecopyresampled (example) without resizing.

Why does Imagick turn the switch backgroundcolor?

I'm trying to convert an pdf to a jpeg, trim the whitespaces around the content and resize it to 300x600
In PHP using ImageMagick 6.7.7-10
here's my code:
$im = new \Imagick();
$im->setBackgroundColor("white");
$im->readimage($url);
$im->setImageFormat("jpeg");
$im->trimImage(0);
$im->resizeImage(300, 600, Imagick::FILTER_LANCZOS, 0.9);
$im->writeImage($tmpFilePath);
$im->clear();
$im->destroy();
here is the PDF
http://cs1.fuman.de/file.php/1AOrL6-PzT71Z-dk0000-CsjquC
and here the resulting JPG
http://cs1.fuman.de/file.php/1AOrL0-kWAl8P-ml0000-xAhOiw
Does anyone know, what's going wrong here?
Thanks in advance
JD
I don't know why the background color is being ignored. I think it's to do with JPEG not having a concept of a 'background' colour, and so when the image is converted from having alpha to not having alpha, bad things happen.
I suggest using this code:
$imagick = new \Imagick();
// Make the image be large when read from PDF so have decent quality later
$imagick->setResolution(92, 92);
// only use the first page of the PDF
$imagick->readimage("./orig.pdf[0]");
// Make a white background imge
$canvas = new Imagick();
$canvas->newPseudoImage(
$imagick->getImageWidth(),
$imagick->getImageHeight(),
'canvas:white'
);
// Need to use png format to keep alpha channge
$imagick->setImageFormat('png');
// Composite our image, into the white background
$canvas->compositeImage($imagick, \Imagick::COMPOSITE_ATOP, 0, 0);
$canvas->resizeImage(300, 600, Imagick::FILTER_LANCZOS, 1);
$canvas->setImageFormat('png');
$canvas->writeImage("output.png");

php add a picture onto another

I would like to change the color of an image with php.
if I wanted to make it appear redder applicherei an image on a higher level across an image with a transparent red and more or less high can indicate how the original photo should be red.
I can say gd php functions to create an image of a color (RGBA) and apply it to another image?
thanks :)
You can try using GD's imagecopymerge function, which copies one image to another and supports alpha transparency. Something like this should work:
<?php
$redimg = imagecreatetruecolor(100, 100);
$image = imagecreatefrompng('image.png');
// sets background to red
$red = imagecolorallocate($redimg, 255, 0, 0);
imagefill($redimg, 0, 0, $red);
// Merge the red image onto the PNG image
imagecopymerge($image, $redimg, 0, 0, 0, 0, 100, 100, 75);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
imagedestroy($redimg);
?>
There's more information here.

Merging Images using GD with PHP

i'm working on creating one PNG image from two others.
Image A and B have the same dimensions, they are both 200x400px. The final image the same.
I'm using the GD library with PHP.
So my idea was to create a PNG-24 from my original PNG-8, then use color transparency and finally copy the second image into
this new PNG-24. The problem appears in the first step anyway, when going from PNG-24 to PNG-8 with color transparency:
This is to get the original PNG-8 and it's dimensions:
$png8 = imagecreatefrompng($imageUrl);
$size = getimagesize($imageUrl);
Now i create a new PNG and fill it's background with a green color (not present in the images):
$png24 = imagecreatetruecolor($size[0], $size[1]);
$transparentIndex = imagecolorallocate($png24, 0x66, 0xff, 0x66);
imagefill($png24, 0, 0, $transparentIndex);
This is for making the green color transparent:
imagecolortransparent($png24, $transparentIndex);
Then i copy the png8 into the PNG-24:
imagecopy($png24, $png8, 0, 0, 0, 0, $size[0], $size[1]);
So here's the problem: the original PNG-8 looks good, but it has a green border surrounding the shape within the original image. It's difficult to explain really. Seems like some part of the green background is left in the remaining PNG.
What can i do?
thanks in advance
best regards,
Fernando
I had some problems with png transparency before and was able to solve them with this pattern:
// allocate original image to copy stuff to
$img = imagecreatetruecolor(200, 100);
// create second image
$bg = imagecreatefrompng('bg.png');
// copy image onto it using imagecopyresampled
imagecopyresampled($img, $bg, 0, 0, 0, 0, 200, 100, 200, 100);
imagedestroy($bg);
// create third image
// do same routine
$fg = imagecreatefrompng('fg.png');
imagecopyresampled($img, $fg, 50, 50, 0, 0, 50, 50, 50, 50);
imagedestroy($fg);
// output image
imagepng($img);
imagedestroy($img);
I think the only difference between mine and yours is imagecopy() vs. imagecopyresampled(). I seem to remember having problems with that though it was quite a while ago. You can see an example of an image I use this pattern on here: http://www.ipnow.org/images/1/bggrad/bg4/yes/TRANSIST.TTF/8B0000/custombrowserimage.jpg (I allocate a blank image, copy the background image in, copy the overlay with transparency in)

PHP gdLib 8-Bit PNG with alpha

how is it possible to save my image, created with gd, as an png-8?
it saves as gif with transparent channel well - but I want to use png-8.
Best Regards,
Beerweasle
Using imagesavealpha() and a transparent bg color should do the trick...
Based on dfilkovi's code:
<?php
// Create a new true color image
$im = new imagecreatetruecolor(100, 100);
// Fill with alpha background
$alphabg = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $alphabg);
// Convert to palette-based with no dithering and 255 colors with alpha
imagetruecolortopalette($im, false, 255);
imagesavealpha($im, true);
// Save the image
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>
#Sonny
false assumption: PNG of any bit depth can have transparency. It is recorded in the tRNS chunk of the png image (except for truecolor ones) cf format definition
cf www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.tRNS
idem www.w3.org/TR/PNG-Chunks.html#C.tRNS
The difference is how it is recorder: RGBA has a unique record per pixel, with 4 values (3 colors and 1 alpha channel), where "paletted" PNG records alpha channel in its own chunk.
Fireworks is very good at it.
Examples:
http://www.libpng.org/pub/png/pngs-img.html
I think this could help you.
http://roseindia.net/tutorial/php/phpgd/About-transparent.html
<?php
// Create a new true color image
$im = new imagecreatetruecolor(100, 100);
// Convert to palette-based with no dithering and 255 colors
imagetruecolortopalette($im, false, 255);
// Save the image
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>
this should make 8bit png
Building on dfilkovi's solution, have you tried using imagesavealpha() to save the full alpha channel information?
I had to add the line imagecolortransparent($im, $alphabg); to the following code (taken from previous answer) for this to work:
// Fill with alpha background
$alphabg = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagecolortransparent($im, $alphabg);
imagefill($im, 0, 0, $alphabg);
// Convert to palette-based with no dithering and 255 colors with alpha
imagetruecolortopalette($im, false, 255);
imagesavealpha($im, true);
// Save the image
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>

Categories