I'm completely new to ImageMagic. Now I try to follow this tutorial. I was able to create three separate images using gdalwarp tool. I did it like so:
$ gdalwarp -t_srs EPSG:3857 LC80120542013154LGN00_B4.TIF 4-projected.tif
$ gdalwarp -t_srs EPSG:3857 LC80120542013154LGN00_B3.TIF 3-projected.tif
$ gdalwarp -t_srs EPSG:3857 LC80120542013154LGN00_B2.TIF 2-projected.tif
So, at this moment I have three separate images - 4-projected.tif, 3-projected.tif and 2-projected.tif and want to combine them, but I do not know how should I interpret this command from the tutorial:
$ convert -combine {4,3,2}-projected.tif RGB.tif
I'm not sure whether I should run them one by one, or should I use some one-line command. I tried it just as it is, but got the error message:
Unable to open {4,3,2}-projected.tif image
I also tried to run this command one by one, like:
$ convert -combine 4-projected.tif RGB.tif
$ convert -combine 3-projected.tif RGB.tif
$ convert -combine 2-projected.tif RGB.tif
But it seems like each following command just rewrites the previous one and instead of combination I just have RGB.tif which is totally identical to 2-projected.tif. So, I need some help.
Assuming each of those is a single band (greyscale) image and that you want to use 4.tif as your red channel, 3.tif as your green and 2.tif as your blue channel:
convert 4.tif 3.tif 2.tif -combine result.tif
Also, I would generally recommend lossless compression, else TIF files tend to end up excessively large for no benefit:
convert 4.tif 3.tif 2.tif -combine -compress lzw result.tif
Related
I'm trying to find the unique amount of colors in an image and I've come across ImageMagick's identify tool that is used at the command line.
identify -unique-colors sunset.png
This has worked well in my tests, giving me much more accurate results compared to other tools.
My problem is the images I'd like to incorporate this into a script to examine images that aren't written to the hard drive. Is it possible to pipe a stream of data into the command? Something like:
echo xxx | identify -unique-colors
I think I have understood your use case. Effectively, you want to do this with PHP:
cat IMAGE.PNG | magick - -unique-colors txt:
or
cat IMAGE.JPG | magick - -unique-colors txt:
The - tells ImageMagick to read from its stdin.
I'm converting about 9000 photos from .NEF to .jpg.
I'd like to retain all EXIF data, most importantly Date and time created, Latidude and Longitude.
I'd like the JPGs to be at the highest possible quality.
I've just gotten started using ImageMagick from the command line. I also have Exiftool installed. I'm using the mogrify command because it handles batches nicely.
When I run
mogrify -format jpg *.NEF
All of my .NEF files are successfully converted to JPGs, but all EXIF data are lost.
I've searched around quite a bit to try and find a solution to this and it seems like I may have to install ufraw, but if possible I'd like a solution that uses software I already have - ImageMagick and Exiftool.
Thanks in advance for any advice you have about how to do this.
Update:
The images I converted using mogrify are slightly smaller (~ 1-2 MB) than those output by my colleague using picasa to convert NEF to JPG. But when I specify -quality 100 in ImageMagick the image sizes gain about 45 MB! Why?
The code exiftool -tagsfromfile %d%f.NEF -ext jpg -overwrite_original . adds the exif information to the JPGs.
Think twice before doing this - you really are discarding a lot of information - and if you don't want it, why not shoot JPEG instead of RAW in the first place?
FWIW, you can use ImageMagick to get the JPEG:
convert somefile.NEF somefile.jpg
Then you can copy the tags across from the original to the file newly created by ImageMagick:
exiftool -tagsfromfile somefile.NEF -all:all somefile.jpg
If you have thousands of images, and are on macOS or a decent Linux/Unix-based OS, I would recommend GNU Parallel like this and it will keep busy all those lovely cores that you paid Intel so dearly for:
parallel --dry-run 'convert {} {.}.jpg; exiftool -tagsfromfile {} -all:all {.}.jpg' ::: *nef
Sample Output
convert a.nef a.jpg; exiftool -tagsfromfile a.nef -all:all a.jpg
convert b.nef b.jpg; exiftool -tagsfromfile b.nef -all:all b.jpg
and if that looks good remove the --dry-run so it actually runs the command.
If you are on Windows, you will have to do some ad-hoc jiggery-pokery to get it done in any reasonable time frame. You can use the mogrify command and get all the conversions done to JPEG and then do all the exiftool re-embedding of the EXIF data later. If your files are named with some sort of system with incrementing numbers, you can start two or three copies of mogrify in parallel - say one doing files whose names end in [0-4] and another one doing files whose names end in [5-9]. I don't speak Windows, but that would probably look like these two commands each running in its own Command Prompt:
mogrify -format jpg *0.NEF *1.NEF *2.NEF *3.NEF *4.NEF
mogrify -format jpg *5.NEF *6.NEF *7.NEF *8.NEF *9.NEF
Then you would do the exiftool stuff when they had all finished but you would have to use a FOR loop like this:
FOR %%G IN (*.NEF) DO (
exiftool -tagsfromfile %%G -all:all %%~dpnG.jpg
)
The %%~dpnG part is a guess based on this answer.
I was surprised to discover that StackOverflow has a "Photoshop" tag because I need to combine Photoshop (- Pro, Creative Cloud subscription) and programming (I'm an experienced Java, C#, C++ sw engineer) for an art project.
I want to take a folder with up to 2000 JPEG files and, starting with the first file, isolate the red channel of the first file, the green channel of the second file, and the blue channel of the third file and combine those into one new JPEG file, and save it. Then repeat this for the next 3 files, the next three, etc.
I originally planned to find a JPEG library for C# and do it all there, but if I can harness Photoshop, which I use routinely for other stuff, that might be easier. Does Photoshop have a robust scripting/programming language with a syntax similar enough to a conventional programming language (conditional loops, file i-o, user-defined variables, functions or subroutines, etc) to do this?
You can use Javascript, VBScript (on Windows) and Applescript (on Mac) to script Photoshop - Adobe website.
However, for this simple task, I would use ImageMagick which is installed on most Linux distros and is readily available for free on OS X and Windows.
So, if you start with these three images:
You could type the following into the shell/Terminal/Command Prompt:
convert 1.png -separate -delete 1,2 \
\( 2.png -separate -delete 0,2 \) \
\( 3.png -separate -delete 0,1 \) -combine result.png
to get this:
That command takes the first image, splits it into RGB channels (internally numbered as R=0, G=1, B=2) and deletes G and B. Then it loads the second image, splits it into RGB channels and deletes the R and B and the third image and deletes all but the blue. Then it combines the remaining 3 channels into a single output image.
It will work just the same for JPEG input/output images if you change the extensions.
I'm working on a big problem: I have to create a perfect colored JPEG from a PDF file. But there still small differences in green or blue color. I'm using Ghostscript version 8.71 on a Debian system.
Original PDF file:
http://content.test.de/configurations/82/e2/82e2897f5448e73769655317e8fdee77/output.pdf
The simple way via
convert output.pdf -density 600 -quality 100 output.jpg
Result:
http://content.test.de/configurations/82/e2/82e2897f5448e73769655317e8fdee77/output-0.jpg
creates a very light green having nothing to do with the color in the PDF.
After that I tried two other ways with better results, but not perfect:
Via ImageMagick:
convert output.pdf -profile sRGB_v4_ICC_preference.icc \
-density 600 -quality 100 test.jpg
convert -profile ISOcoated_v2_eci.icc -profile eciRGB_v2.icc \
-quality 100 test-1.jpg finish-1.png
Result: Links like before with filename "finish-0.png" (I can just write two links).
Via Ghostscript:
gs -dNOPAUSE -sDEVICE=jpegcmyk -dFirstPage=1 -dLastPage=237 \
-sOutputFile=image%d.jpg -dJPEGQ=95 -dUseCIEColor -g850x610 \
-dPDFFitPage -r300 -q output.pdf -c quit
Result: Links like before with filename "image1.jpg" (I can just write two links).
Anybody has an idea to get a perfect result?
First, use a recent version of Ghostscript, 8.71 is 3 years old. Versions prior to 9.0 will use standard PostScript colour conversions, 9.0 onwards use Little CMS. Your PDF file uses ICC profile based colour spaces with 3 components (RGB), PostScritp RGB->CMYK is fast but inaccurate, so best not to do that.
I believe that if you use a decently up to date version you will find the results adequate without any further tweaking. Do NOT use -dUseCIEColor! That's a horrible PostScript kludge.
It also looks like the jpegcmyk device isn't doing proper colour management, is there a reason you can't use the jpeg device ?
I am using the ImageMagick convert utility right now. I have a PostScript file that takes about 90 seconds to convert to GIF.
I am looking for a faster way to do this perferably by modifying the options to "convert".
When I say "fast", ideally a few seconds but I'll take any significant speed up. Something suitable for an interactive GUI.
I only need this in black and white or greyscale (specifically it is is an image of seismic data "wiggle traces" so B&W is fine.)
Other acceptable formats are BMP, GIF, JPEG, JPG, PCX, PGM, PNG, PNM, PPM, RAS, TGA, TIF, or TIFF.
Trying to stick with ImageMagick as that is already installed and trying to avoid selling my boss on anything new. Still happy to hear other suggestions.
My suggestion is: Use Ghostscript.
Since you have a working ImageMagick already installed, that means Ghostscript is also there: because ImageMagick cannot convert PDF or PostScript to raster images all by its own -- it has to call Ghostscript as its delegate to do this anyway.
Ghostscript can directly convert PDF/PostScript input to TIFF/TIF/TIFFg4, JPEG, PBM, PCX, PNG, PNM, PPM, BMP raster image output.
The advantages are: you don't need to have ImageMagick involved. So it's faster and also gives you more direct control over the conversion parameters. If you run Ghostscript via ImageMagick that's a level of indirection which isn't always required. (Sometimes it may be required to add some fine-tuning and post-processing manipulations to the raster image data that Ghostscript generated -- but that doesn't seem to be the case for you.)
The only disadvantage is: Ghostscript cannot produce GIF. If you required GIF (which you don't seem to), you need ImageMagick for post-processing the raster output of Ghostscript to GIF.
You can see how ImageMagick calls Ghostscript (and which parameters it uses for the call -- look for a printed line on stderr containing gs, gsx or gswin32c or gswin64c) by running for example:
convert -verbose some.pdf[0] some.gif
Update
I did run a very, very un-scientific 'benchmark', running the following two commands 100 time each, which convert the randomly picked page 333 of the official PDF specification (ISO version for PDF-1.7) to GIF, measuring the time consumed. I run these commands in concurrently parallel, so both should have had to deal with the same overall system load, making the results better comparable:
'Comfortably' using ImageMagick's convert to directly produce GIF:
time for i in $(seq -w 1 100); do
convert \
PDF32000_2008.pdf[333] \
p333-im-no_${i}.gif ;
done
Using Ghostscript to create from the same page grayscale PNGs, piping Ghostscript's output to ImageMagick's convert in order to get GIFs:
time for i in $(seq -w 1 100); do
gs \
-q \
-o - \
-dFirstPage=333 \
-dLastPage=333 \
-sDEVICE=pnggray \
PDF32000_2008.pdf \
| \
convert \
- \
p333-gs-no_${i}.gif ;
done
Timing esults for the first command (running the 'comfortable' convert to achieve the PDF->GIF transformation, which uses Ghostscript only 'behind our backs'):
real 2m29.282s
user 2m22.526s
sys 0m5.647s
Timing results for the second command (running gs directly + openly, piping it's output to convert:
real 1m27.370s
user 1m23.447s
sys 0m3.435s
One more thing:
The total size of the 100 'Ghostscript'-GIFs was 1,6 MByte -- but they were 8-bit grayscale.
The total size of the 100 'ImageMagic-direct'-GIFs was 1,2 MByte -- but they were 2-bit black+white.
I don't have the motivation currently to tweak the test commandline parameters more for even closer comparability of the resulting files.
This result (149 seconds vs. 87 seconds) gives me enough confidence into my guess that you can gain significant performance improvements when you follow my recommendation. :-)
I am using the ImageMagick convert utility right now. I have a
PostScript file that takes about 90 seconds to convert to GIF.
I am looking for a faster way to do this perferably by modifying the
options to "convert".
When I say "fast", ideally a few seconds but I'll take any significant
speed up. Something suitable for an interactive GUI.
I only need this in black and white or greyscale (specifically it is
is an image of seismic data "wiggle traces" so B&W is fine.)
You can start with GhostScript:
gs -dSAFER -dBATCH -dNOPAUSE \
-sDEVICE=pnggray -r300 -sOutputFile=seismic.png seismic.pdf
A very longer but interesting way would be to analyze exactly what is in those PDFs.
I had to do something similar with the PDF output of an EKG workflow. The original data were unavailable, we only had the PDF, but I discovered that the PDF was vector based and not raster. After a little hacking it was very easy to decode the labels, the legend and the single elementary lines making up the EKG diagram, and I came up with an option to recolor the tracks starting from what appeared a grayscale image. It did take several days, though.
It is possible that your PDF is generated in a similar way, and the data could be decoded (at first I had to use pdftk to get me a non-compressed PDF, then I found a library that I could use - it implemented the Deflate algorithm). It would be really cool to have output in SVG format :-)