Page 1 of 1

composite fails on /dev/fd/nn

Posted: 2017-10-18T18:29:02-07:00
by gkuenning
The composite command used to accept input from pipes. In a recent release, it stopped doing so, probably due to seeking on an input file.

To reproduce, on a LInux system under bash (or probably zsh, though I haven't tested that):

composite png:<(convert -size 200 label:abcdefg png:-) -watermark 15 some-image.jpg > /dev/null

where "some-image.jpg" is a JPEG image.

This command used to work fine, but under ImageMagick 7.0.7-8 Q16 x86_64 20171015 it fails as follows:

composite: insufficient image data in file `/dev/fd/63' @ error/png.c/ReadPNGImage/4220.
composite: `some-image.jpg' @ error/composite.c/CompositeImageCommand/1613.

It's possible to work around the problem by using a temporary file, but it's a pain--and avoiding temp files is the whole point of pipes.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-18T19:01:58-07:00
by fmw42
You are on IM 7. Things have changed a bit since IM 6. Use magick in place of convert. Also put magick before composite, identify, montage, mogrify, etc.

I would really suggest you get out of the habit of using the limited composite and start using magick ... -compose -composite in its place. It is much more flexible and allows you to avoid the redirect from a second convert by using parenthesis processing.

try

Code: Select all

magick some-image.jpg \( -size 200 label:abcdefg \) -define compose:args=15 -composite result.png
if on Windows, remove the \ escapes.

See http://www.imagemagick.org/Usage/compose/#watermark

and

http://imagemagick.org/script/porting.php#cli

Re: composite fails on /dev/fd/nn

Posted: 2017-10-19T13:38:54-07:00
by gkuenning
Thanks for the pointer and the workaround.

However, let's be clear that it's still a bug. Backwards compatibility has been broken, and existing software that depends on the old feature is failing, so the bug still needs to be fixed.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-19T15:22:39-07:00
by fmw42
If you use IM 7, then things have changed. You cannot use old convert syntax. Try

Code: Select all

magick composite png:<(magick -size 200 label:abcdefg png:-) -watermark 15 some-image.jpg > /dev/null
If you want to use the old convert and composite syntax, then you will have to back down to IM 6.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-21T08:06:53-07:00
by magick
Can post a command that we can copy / paste under Bash that works. Your current command fails to grok under Bash. If we can reproduce the problem, we will attempt to patch it.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-23T11:31:46-07:00
by gkuenning
How does it fail on bash?

I just copied and pasted from my Web browser into bash, and it worked (or rather failed) just fine (mallet:501> is the prompt):

mallet:501> composite png:<(convert -size 200 label:abcdefg png:-) -watermark 15 some-image.jpg > /dev/null
composite: insufficient image data in file `/dev/fd/63' @ error/png.c/ReadPNGImage/4220.
composite: `some-image.jpg' @ error/composite.c/CompositeImageCommand/1613.

I didn't even need to replace some-image.jpg with the name of a real image.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-23T11:34:14-07:00
by gkuenning
fmw42 wrote: 2017-10-19T15:22:39-07:00 If you use IM 7, then things have changed. You cannot use old convert syntax. Try

Code: Select all

magick composite png:<(magick -size 200 label:abcdefg png:-) -watermark 15 some-image.jpg > /dev/null
If you want to use the old convert and composite syntax, then you will have to back down to IM 6.
fwm42, I think you misunderstand the entire concept of backwards compatibility. So here's a quick primer: if a command is used by 1000 sites, and it takes each site 30 minutes to adapt to a change that breaks existing code, then 500 hours of people time have been wasted. If maintaining compatibility would have taken 10 hours, then it's a 50-to-1 loss in productivity.

I'm pretty sure ImageMagick is used by a lot more than 1000 people.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-23T11:38:14-07:00
by fmw42
ImageMagick 7 is different from ImageMagick 6. There are things that will not be backward compatible. I think you can install the legacy components and still use the old code.

But I will leave this between you and the ImageMagick developers to discuss.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-23T11:57:24-07:00
by gkuenning
Fwm42, maybe someday when you've experienced the other side for yourself you'll have a clearer perspective.

But FWIW your suggestion fails in exactly the same way--which is hardly surprising, since composite and convert are just symlinks to magick.

Re: composite fails on /dev/fd/nn

Posted: 2017-10-23T12:25:03-07:00
by fmw42
composite is not just a symlink. You have to preface it with magick in IM 7, since magick is the only thing really new and composite is still the old one. So you have to call it from magick. The convert command can still be used if you have a symlink between convert to magick in IM 7. Or you can just install the legacy IM 6. But I am not an expert on symlinks and other stuff like this. But see http://imagemagick.org/script/porting.php#cli.

In fact, I have over 300 scripts that I have had to deal with to be sure that they run properly under IM 7 as well as IM 6 (see my link at the bottom of this message box). So I have had to put in version tests and do different things where needed. So I am familiar with the importance of backward compatibility. I have been working with the IM developers to make this as transparent as possible. But there are things in IM 7 that are different. I have had to change a number of things in my scripts to be compatible with both versions. One of them is not using composite. However, I still have to make use of identify. In my scripts I have to put in version tests so that in IM 6 it is identify, but in IM 7 it is magick identify. This is true for montage and mogrify as well. All my scripts still keep convert syntax, since it is just a symlink to magick.

I sympathize with you. But I have completely gotten away from the use of composite, since convert ... -composite is so much more flexible. What you have with the redirect from one convert to a composite can be done in one convert command and thus no need to redirect that part.

But I do understand your situation.

Perhaps the IM developers can help you further. I am not a software engineer. I only do bash scripting with ImageMagick.