Imagecolortransparent() for multiple colors - php

I use this code to make all white pixels transparent:
$img = imagecreatefromjpeg('test.jpg');
$remove = imagecolorallocate($img, 255, 255, 255);
imagecolortransparent($img, $remove);
imagepng($img, 'bla.png');
But I also want some "almost white" pixels to be transparent like 254, 255, 255 etc. How could I add that?

If your question is how to remove a contiguous area with similar color range; I must say that it's hard using PHP's GD library. You should take a look at ImageMagick which is a much more powerful image processing library and has PHP integration.
If you choose to use ImageMagick instead, you'll have access to a lot of third-party scripts that does amazing image processings. One of which is Fred Weinhaus' MagicWand. It does what you're looking for.
You seed it with an x and y coordinate, it can extract the color of that coordinate and make it transparent with a configurable color dissimilarity threshold (fuzz factor). Have a look how it can match a gradient of blue:

I had the same problem. With a black and white image. But white was not very white. So before to set transparency, I do a filter to increase the contrast. And I have an image with real black and real white. And when I use transparency on white color, it's works fine.
Filter's example :
imagefilter($src,IMG_FILTER_CONTRAST,-50);

Related

How to add a transparent rectangle to PNG file in php WITHOUT a border

I can successfully add a transparent rectangle to an area of a saved PNG file, but it has a faint border around it, which can be seen on the final image. I want to remove this.
The code I use to add the rectangle is:
$dest=imagecreatefrompng("originalFilename.png");
$red = imagecolorallocate($dest, 255, 0, 0);
imagecolortransparent($dest, $red);
imagefilledrectangle($dest, 0, 0, 50, 25, $red);
imagepng($dest, "newFilename.png");
and the result looks like this:
Image showing rectangle outline
The transparency works fine, showing in this example a white background behind... but you can see that in the top left there's the faint outline of the transparent rectangle. This is what I want to remove.
I've since tried putting a box over the edge (it would be white to match the background of the image, but using green for display purposes here), but that box gets a slightly red huhe around it too!?!? Really strange.
Like this
red hue
Grateful for any clues. This is not the same as the suggested duplicate as it deals specifically with the hue that's left around the border of the transparent area and also any object made to go in that area.

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

I would like to know and find out, how I can colorize/replace any pixel of an image, that is not (fully) transparent with an opaque pixel.
For example, having a multicolored Logo with transparent pixels, I would like to convert it in to a logo with only the color #ff0000, and not change the transparent background.
I want to achieve this with the PHP Imagick Library. I cannot find any good documentation.
I thought that Imagick::thresholdImage would be a helper, but there is no documentation about the threshold parameter.
Best results are achieved with this fragment of code. But still not working perfectly. Some pixels - i guess those with alpha > 0 and < 1 are not replaced.
$image = new \Imagick($source);
$image->setImageFormat('png');
$fill = new \ImagickPixel('#ff0000');
$image->thresholdImage(0);
$image->paintOpaqueImage('#ffffff', $fill, 1);
$image->writeImage($destination);
I would like to know and find out, how I can colorize/replace any pixel of an image, that is not (fully) transparent with an opaque pixel.
You almost certainly don't.
The code below does what you are asking (I think) and the output looks terrible. Perhaps you should give an example input image, and a hoped for example output image, that you have edited in Photoshop, to show what you were hoping for.
Input image:
Output image:
$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");

PHP GD turn background into transparent or alpha

I have an jpeg image, I want to use php GD to create 2 boxs.
left box will remove background and set transparent
Right box will set rgba - alpha 80%;
and save it in png transparance
I have try imagesetpixel, but its not transparent,
I also try imagecolortransparent
$transparentcolour = imagecolorallocate($im, 40,220,1);
imagecolortransparent($image, $transparentcolour);
but this will turn everything into transparent in this color.
anyone know how to achieve this?
The straight transparent is easy:
Disable alpha blending
Allocate a colour with alpha - personally I use (255,0,255,127) because magenta is the "standard" transparent colour when working with game sprites, so I just sort of stuck with it
Draw the rectangle
The result will be a block of transparency.
Function reference: imagealphablending, imagecolorallocatealpha, imagefilledrectangle
The "fade by 80%" thing will be trickier.
Disable alpha blending
For each (x,y) in the rectangle... (ie. two nested for loops)
Get the colour of that pixel (imagecolorat and imagecolorsforindex should help)
Multiply $color['alpha'] by 0.2 for an 80% fade
Allocate a new colour with the same RGB as the source, but with the new A value
Draw the pixel
The result will be a block of 80%-faded-to-transparent pixels.
Function reference: imagealphablending, imagecolorat, imagecolorsforindex, imagecolorallocatealpha, imagesetpixel

Transparency issue with png images

I 've got this image:
i use php5 and gd2 library to achieve a transparent background, but the result is not what i have expected(you need a dark background to see the difference):
and here is my code:
$size = getimagesize($img_url);
$img = imagecreatefrompng($img_url);
$im_tc = imagecreatetruecolor($size[0],$size[1]);
imagecopyresampled($im_tc,$img,0,0,0,0,$size[0],$size[1],$size[0],$size[1]);
imagedestroy($img);
$white = imagecolorallocatealpha($im_tc, 255, 255, 255,127);
imagecolortransparent($im_tc, $white);
imagepng($im_tc,'image.png');
Any help would be appreciated! :)
Your original image doesn't have a transparent background, but you're trying to create one by changing all pure-white pixels to transparent. As the text has a shadow/glow around it, those pixels aren't quite white, and won't become transparent. You have a couple options here:
Use an image editor (GIMP, Photoshop, etc.) and their fine-grained selection tools to perform a smart selection of the "background", then remove that. Photoshop, at least, has extremely useful options available on its magic wand tool to choose threshold, feathering, and more.
Pick more colours to make "transparent." Instead of just white, choose all of the shades of gray, minus the exact colour that ".gr" is set in. This should make all of the shadowed parts of the image transparent as well, although the edges may be less than perfect (i.e.: not feathered, slightly jagged.)

change shirt color with gd library

i m trying to change color of a shirt. here is my code in its simplest form.
$imgname = "me.jpg";
$im = imagecreatefromjpeg ($imgname);
imagetruecolortopalette($im,false, 255);
$index = imagecolorclosest ( $im, 96, 132, 194 ); // get COlor
imagecolorset($im,$index,92,92,92); // SET NEW COLOR
$imgname = "result.jpg";
imagejpeg($im, $imgname ); // save image as gif
//imagedestroy($im);
but this code does change only specific color. You can see in attached image.
i want whole shirt color changed from blue to grey. is it possible with GD library or any other library? If yes how??
Using GD to accomplish this seems like using chainsaw to slice bread. An easier (and I think better) way to handle this would be to have the shirt be a transparent PNG with transparent shadows in the correct places. Then you can simply change the background color of the image container using any number of freely available color pickers. Since the shirt is transparent, it then becomes the color of the background (blue, gray, whatever). Once the user has selected a color that works, you can pass that hex color to the back-end along with the rest of the order information (size, etc).

Categories