Page 1 of 1
disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T13:34:09-07:00
by bayek
Hi,
I have two questions
1. How can I disable antialiasing for MagickRotateImage(wand, background, degrees) ?
The image contains thin black contours more suitable for vector format. Background pixel wand is transparent. Rotation with imagemagick adds antialiasing pixels around the contours. Is it possible to have the result in exact the same colour, without any antialiasing? I understand that there will be jagged edges, it does not matter.
2. Is it possible to make MagickAppendImages do partial overlapping of the images? Preferably with configurable overlapping for each image in the sequence.
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T15:15:57-07:00
by snibgo
1. I'm not sure exactly what you want. If you have an image that is black and white only, and rotate it, the result will also contain shades of gray.
I don't think there is any way to prevent this. Using "-distort SRT" with one of the filters such as box or point might have done this, but it doesn't seem to.
Working at a lower level, calling the functions, might offer an alternative. I don't know.
Another possibility is simply to threshold after the rotation.
2. MagickSmushImages() seems a better choice, as smush is effectively "append with positive or negative gap". See
http://www.imagemagick.org/script/comma ... .php#smush and
viewtopic.php?f=1&t=30720
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T15:56:59-07:00
by bayek
smush crashes on the same wand append works with without errors, with "MagickWand/magick-image.c:10542: MagickSetImageType: Assertion `wand != (MagickWand *) NULL' failed."
Code: Select all
MagickAppendImages(mw, MagickFalse); //ok
//MagickSmushImages(mw, MagickFalse, 0.0); //crash
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T16:12:54-07:00
by fmw42
What is your IM version and Platform? Perhaps you need to upgrade your IM to the current version to get smush to work? It will give partial overlap, for which append will not.
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T16:32:20-07:00
by bayek
Linux gentoo x64, Imagemagick 7, built from github
git clone
http://git.imagemagick.org/repos/ImageMagick
Code: Select all
Version: ImageMagick 7.0.4-2 Q16 x86_64 2017-01-01 http://www.imagemagick.org
Copyright: © 1999-2017 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI
Delegates (built-in): png
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-01T17:13:48-07:00
by snibgo
bayek wrote:"MagickWand/magick-image.c:10542: MagickSetImageType: Assertion `wand != (MagickWand *) NULL' failed."
So the failure is in function MagickSetImageType(). As far as I can see, MagickSmushImages() doesn't call that function. So something else in your code calls it, directly or indirectly.
Does your code correctly check for errors, or does it ignore them? Where, in your code, does the MagickSetImageType() failure occur?
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-02T01:00:22-07:00
by bayek
Yes you are right, smush just returns NULL, so the next line crashes.
The code looks like that:
Code: Select all
mwcombined = MagickSmushImages(mw, MagickFalse, 0.0);
MagickSetImageType(mwcombined, PaletteAlphaType);
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-02T03:32:40-07:00
by bayek
also I don't understand another thing
MagickOpaquePaintImage
MagickOpaquePaintImage() changes any pixel that matches color with the color defined by fill.
Code: Select all
MagickSetImageType(mwcombined, GrayscaleAlphaType);
MagickWriteImage(mwcombined,"1.png");
pwwhite = NewPixelWand();
PixelSetColor(pwwhite,"white");
pwtransparent = NewPixelWand();
PixelSetColor(pwtransparent,"none");
MagickOpaquePaintImage(mwcombined, pwwhite, pwtransparent, 100, MagickFalse);
MagickWriteImage(mwcombined,"2.png");
this code is supposed to change white parts of the mwcombined to transparent, but it doesn't do this. It does something other though, as the image size gets changed, but there are no visible changes. Different values of fuzz change nothig.
http://i.cubeupload.com/F7jU0J.png - 1.png
http://i.cubeupload.com/uF8GQd.png - 2.png
both images have white line at the bottom and black/transparent above, it can be seen in gimp bettern than in browser.
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-02T03:54:16-07:00
by snibgo
You want to change pixels to be transparent, but you are using MagickOpaquePaintImage()? Have you tried MagickTransparentPaintImage()?
Re: disable antialiasig for rotation and MagickAppendImages with overlapping
Posted: 2017-01-02T04:23:18-07:00
by bayek
MagickTransparentPaintImage changes nothing. But I found that if I use MagickTrue as the last parameter (invert) of the MagickTransparentPaintImage, it makes all the image transparent. So apparently it just does not think that color of the target matches color of the image which should be replaced. I tried both "white" and "#fefefe" (the exact lolour from colorpicker in gimp)
http://i.cubeupload.com/uF8GQd.png, but it does not match the colour in any of combination of the parameters.
And I don't understand why MagickSmushImages returns NULL.