Getting Improper image header error in ImageMagick 7.0.7 - imagemagick

I am running ImageMagick on Mac OS High Sierra
The following commands work fine with ImageMagick 6.9.0
convert -define stream:buffer-size=0 png:- png:- -alpha off -compose copy-opacity -composite png:-
compare -define stream:buffer-size=0 -fuzz 17% -metric AE png:- png:- png:-
I updated ImageMagick 6.9.0 to ImageMagick 7.0.7-28 then both of these commands started failing with the below error messages
magick -define stream:buffer-size=0 png:- png:- -alpha off -compose copy-opacity -composite png:-
magick: improper image header `/var/folders/tb/11n2czg57ts9dzxypdsmlqk99c46m9/T/magick-26635byT1dtHsAuT3' # error/png.c/ReadPNGImage/4231.
magick compare -define stream:buffer-size=0 -fuzz 17% -metric AE png:- png:- png:-
For input string: "compare: improper image header `/var/folders/tb/11n2czg57ts9dzxypdsmlqk99c46m9/T/magick-26363xwcFdjrv3CT0' # error/png.c/ReadPNGImage/4231."
Can you please guide me what I have to change in those commands?
If I store png files in a temporary folder and run the above commands by replacing png:- with temporary file path then both the commands run fine. But I want the commands to work with InputStream.
Thanks in advance!

I'm not sure you can stream two PNG files concatenated together as PNGs into ImageMagick's input stream. Essentially, you are trying to do this:
{ convert xc:red png:- ; convert xc:blue png:- ; } | convert png:- png:- -append result.png
which doesn't work, because, I think, the final convert will read the entire input stream when it encounters the first png:- and there will be nothing left for the second png:-.
I think the only safe way to send multiple concatenated images through a single channel is by using the MIFF "Magic Image File Format" which does support multiple images:
{ convert xc:red miff:- ; convert xc:blue miff:- ; } | convert miff:- -append result.png

Related

ImageMagick: delete input files when appending?

When I try
magick mogrify +append 1.jpg 2.jpg 3.jpg
I get an error saying: "mogrify: unable to open 3.jpg". Is there a way to automatically delete the two input files?
Just collating the comments together for clarity...
You can append 3 images side-by-side, and remove the input images if the command succeeds like this:
magick 1.jpg 2.jpg 3.jpg +append result.jpg && rm [123].jpg
By the way, +append is quite long in the tooth and there is a more recent, more useful operator called +/-smush which works exactly the same as +/-append but allows you to create a gap with the +smush version and an overlap with the -smush version:
magick 1.jpg 2.jpg 3.jpg -background black +smush 10 result.jpg && rm [123].jpg

Combine multiple command line commands into one single command (pipeline)

How do I combine the following ImageMagick command line commands into a single instruction:
convert -trim "C:\test\test.webp" -quality 95 "C:\test\testMaxNew.webp"
convert "C:\test\testMaxNew.webp" -resize 750x750 "C:\test\testMediumNew.webp"
convert "C:\test\testMediumNew.webp" -thumbnail 100x100^ "C:\test\testSmallNew.webp"
After some trial and error I came up with this:
convert -trim C:\test\test.webp -quality 95 -write mpr:XY +delete \( mpr:XY +write C:\test\testLargeNew.webp +delete \) \( mpr:XY -resize 750x750 +write C:\test\testMediumNew.webp +delete \) \( mpr:XY -resize 100x100^ -gravity center -extent 100x100 +write C:\test\testSmallNew.webp +delete \)
This does the trick but the following errors are reported in the command line prompt:
> convert: unable to open image '\(': No such file or directory #
> error/blob.c/OpenBlob/2695. convert: no decode delegate for this image
> format `' # error/constitute.c/ReadImage/508. convert: unable to open
> image '\)': No such file or directory # error/blob.c/OpenBlob/2695.
> convert: no decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\(':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\)':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\(':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: no images defined `\)' #
> error/convert.c/ConvertImageCommand/3235.
Can someone explain why I am getting these errors and if my code is correct?
The reason I am trying to combine multiple commands is to minimize processing time.
Version: ImageMagick 7.0.2-0 Q16 x64 on Windows 10
These should do what you want.
Best to read the input right after convert.
I am not sure why you need to resize and thumbnail.
So in Imagemagick try one of the following:
convert "C:\test\test.webp" -trim +repage -quality 95 -resize 750x750 -thumbnail 100x100^ "C:\test\testSmallNew.webp"
or just
convert "C:\test\test.webp" -trim +repage -quality 95 -thumbnail 100x100^ "C:\test\testSmallNew.webp"
Just adding an answer to clarify a couple of things that are not a good fit for comments.
You already have some excellent advice from Fred (#fmw42) as regards reading your input image immediately after convert because that way your command will continue to work when you upgrade to ImageMagick v7 which has already been available a couple of years.
You have added a command that works to your question, but that is a bit clumsy inasmuch as it creates an MPR which you don't need and also creates and destroys images unnecessarily - adding to system load which is undesirable if you have many images to process. I think you can see the following is simpler to understand and maintain, makes fewer copies and deletes and demands on memory, and should achieve the same effect as your command:
convert INPUT.webp -trim +repage -gravity center -quality 95 ^
+write LARGE.webp ^
-resize 350x350 +write MEDIUM.webp ^
-resize 100x100^ -extent 100x100 SMALL.webp

Transparent pattern tiling in Image Magick generates broken pattern

I am trying to generate image with background and pattern like in this image.
Currently I have this command
magick convert \
\( \
-size 512x512 \
-define "gradient:vector=0,0 0,720" "gradient:#5DA2C2-#C70AA0" \
\) \
\( \
-size 4x4 xc:white -alpha transparent \
-channel alpha -fx "(1-min(1,(j+1)%2)) * 0.1" \
-write mpr:lines1 +delete -size 512x512 tile:mpr:lines1 \
\) -composite \
\( \
-size 4x4 xc:white -alpha transparent \
-channel alpha -fx "(1-min(1,j%4)) * 0.25" \
-write mpr:lines2 +delete -size 512x512 tile:mpr:lines2 \
\) -composite \
wallpaper.png
which yields this. You may see that pattern is broken (especially at the bottom).
If I set pattern size to 64x64 the problem is gone but that's not a real fix.
What am I doing wrong and how do I fix that without changing the pattern size?
UPD:
Full magick --version (convert --version) output:
Version: ImageMagick 7.0.8-23 Q16 x86_64 2019-01-04 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP
Delegates (built-in): bzlib cairo fontconfig freetype gslib heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png ps raw rsvg tiff webp wmf x xml zlib
Do the lines always appear at the same places from run to run
Yes, for each of the same set of arguments result is the same (but may vary for slightly different sets of arguments like changing resolution or removing write commands from braces).
Just as a test, try saving to TIFF rather than PNG. Does that works
or not?
Changing the output format always produces exactly the same result. I tried tiff, gif, jpeg. (With jpeg those lines are a bit blurred obviously, but result looks pretty much the same). This also applies to fmw42's command variant.
Do you have OpenMP installed with ImageMagick. Also disable OpenCL and see if that helps.
OpenMP is not installed but supported by the IM version I have.
Disabling OpenCL via environment variable MAGICK_OCL_DEVICE=OFF does not change the result. Recompiled IM with and without OpenCL and OpenMP from tag=7.0.8-23 and from master - all the same...
Are you seeing something in tmp4.png that is not visible to me?
Yes, I still can see that rainbow-colored line on white background if I do magick tmp4.png -alpha remove tmp4-opaque.png
Your command works fine for me on ImageMagick 7.0.8.23 Q16 Mac OSX with libpng 1.6.35. But in IM 7 use magick, not magick convert and not convert or you will get IM 6 behavior. Check your version of libpng and upgrade if necessary. What is your version and date of ImageMagick and on what platform?
magick \
\( \
-size 512x512 \
-define gradient:vector="0,0 0,720" gradient:"#5DA2C2-#C70AA0" +write tmp1.png \
\) \
\( \
-size 4x4 xc:white -alpha transparent +write tmp2.png \
-channel alpha -fx "(1-min(1,(j+1)%2)) * 0.1" +write tmp3.png \
-write mpr:lines1 +delete -size 512x512 tile:mpr:lines1 +write tmp4.png \
\) -composite \
\( \
-size 4x4 xc:white -alpha transparent \
-channel alpha -fx "(1-min(1,j%4)) * 0.25" \
-write mpr:lines2 +delete -size 512x512 tile:mpr:lines2 \
\) -composite \
wallpaper.png
Check this and see if it has your same issue. But I do not see any broken lines.

How to use pango in script with imagemagick

Here is a simplified version of the code I'm currently using :
cat $FILES | while read line; do
convert -fill $FG_COLOR -background $BG_COLOR \
-size ${line_width}x${line_height} -page +${x_margin}+${y} \
label:"${varL} and ${varR}" miff:-
done | convert -size ${SCREEN_W}x${SCREEN_H} xc:$BG_COLOR - -flatten image.jpg
And it is working well !
But I wish to have different colors for ${varL} and ${varR}, and I guess I should use pango instead of label. Am I correct about that ?
But by keeping the same code and just replacing label by pango I have an unexpected error :
convert-im6.q16: width or height exceeds limit
I am very confused about how I was able to solve this.
Anyway here is the thing : I don't know why but pango needs to be BEFORE the other arguments.
convert -fill $FG_COLOR -background $BG_COLOR \
-size ${line_width}x${line_height} -page +${x_margin}+${y} \
pango:"${varL} and ${varR}" miff:-
Isn't working, but :
convert pango:"${varL} and ${varR}" \
-fill $FG_COLOR -background $BG_COLOR \
-size ${line_width}x${line_height} -page +${x_margin}+${y} miff:-
Is working !
EDIT: pango: need to be before -page

PHP use of IMAGEMAGICK or imagick or magicwand

I use Imagemagick (www.imagemagick.org)
Since i am on hostgator i also have imagick and magickwand installed.
I can do simple manipulation with imagick and magickwand but if i want to reproduce the advanced tutorials at imagemagick.org i fail.
Goal:
make this working http://www.imagemagick.org/Usage/advanced/#jigsaw
Questions:
How can i do this with imagick or magickwand?
Could i somehow also communicate with the module imagemagick through command line, like exec(....)?
Thanks 4 short help
You can use exec() or shell_exec().
For example:
exec('/path/to/your/imagick/convert jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png');
One more reminder, exec() will not work in PHP safe mode.
Okay. The solution using the command-line commands straight is like the following:
exec("/usr/lib/convert user/set/seinfeld/image/image/data/apple_cinema_30.jpg -edge .5 -blur 0x.5 jaw_ege.png");
so obviously you have to know the path to the module and set the path to the images correctly (a).
will update if necessary with the instructions for imagick/magickwand.
I think it is to complicated to be run in Imagick - not saying it could not be - and as said above the best bet would be Imagemagick command line and exec( ). Build it up one command at a time; you may be able to combine commands later. Do not use jpg for any intermediate images as you will start to loose quality.
It depends what effect you are after as Anthony has a Bash script you could use linked towards the bottom of that section of the page.
You can run that with php using exec:
Upload the script to your server
CHMOD it to either 755 or 777 depending on your server setup
// Run the script
exec("/FULL PATH TO JIGSAW/jigsaw options input.jpg mask.png output.png 2>&1", $array);
//Display any errors
echo "<br>".print_r($array)."<br></pre>";
I do not know if this will work on a Hostgator account but I can not see why not.
Also I have not tried it and you need a mask image to go with your input image.
I have just tried this on my server and get an error: /bin/bash^M: bad interpreter: No such file or directory
This means nothing to me!
Making one jigsaw piece using Anthony's images and code with Imagemagick commaand line and exec( )
exec("convert jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png");
$cmd = " holocaust_md.jpg \( jigsaw_edge.png -negate \) -geometry +365+96 ".
" -compose multiply -composite -crop 100x100+365+96 +repage ";
exec("convert $cmd jigsaw_outline.png");
$cmd = " holocaust_md.jpg -crop 100x100+365+96! -background none -flatten ".
" +repage \( jigsaw_tmpl.png +matte \) -compose CopyOpacity -composite ".
" -rotate -20 -gravity center -crop 100x100+0+0 +repage ";
exec("convert $cmd jigsaw_cutout.png");
$cmd = " jigsaw_cutout.png \( +clone -channel A -separate +channel -negate ".
" -background black -virtual-pixel background -blur 0x2 -shade 120x21.78 ".
" -contrast-stretch 0% +sigmoidal-contrast 7x50% -fill grey50 -colorize 10% ".
" +clone +swap -compose overlay -composite \) -compose In -composite ";
exec("convert $cmd jigsaw_bevel.png");
$cmd = " jigsaw_bevel.png \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) ".
" \( +clone -repage +1+2 \) \( +clone -repage +1+3 \) \( +clone -repage +2+4 \) ".
" \( +clone -repage +2+5 \) -background none -compose DstOver -flatten";
exec("convert $cmd jigsaw_thickness.png");
$cmd = " jigsaw_thickness.png \( +clone -background Black -shadow 50x3+4+4 \) ".
" -background none -compose DstOver -flatten";
exec("convert $cmd jigsaw_shadow.png");

Resources