Bandpass filter with ImageMagick - image
I've been using Fiji's FFT bandpass filter with great success, but I'd like to do this in the command line with ImageMagick. I see that ImageMagick has FFT filters and they documentation includes low-pass and high-pass filters, but can I perform a bandpass filter?
The bandpass filter settings from Fiji that seem to work well for me:
(With apologies that my filter and FFT knowledge is... really bad, so maybe this is easily accomplished if I knew what to chain together, etc...)
A band pass filter similar to the low pass one you show in your link would be a white ring on a black background for square images. The inner and outer radii of the ring determine the frequencies that would be passed. In ImageMagick you can do that as follows:
Input:
Create ring image:
convert lena-1.png -fill black -colorize 100 \
-fill white -draw "translate 64,64 circle 0,0 0,50" \
-fill black -draw "translate 64,64 circle 0,0 0,20" \
-alpha off -blur 0x1 \
ring.png
Do FFT processing with stretch to full dynamic range:
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -auto-level \
lena_bp.png
Alternate processing with gain of 10x:
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png
As I do not know what they have coded in ImageJ or Fiji and you showed no output, I can only guess that what might be equivalent would be to have inner and outer radii at 3 and 40 pixels from the center. Also I have added again a gain of 10x in dynamic range to make it more visible:
convert lena-1.png -fill black -colorize 100 \
-fill white -draw "translate 64,64 circle 0,0 0,40" \
-fill black -draw "translate 64,64 circle 0,0 0,3" \
-alpha off -blur 0x1 \
ring.png
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png
Note that I blurred the ring slightly to reduce "ringing" artifacts. (See https://en.wikipedia.org/wiki/Ringing_artifacts). Many low pass, high pass and band pass filters have stronger/longer tapering similar to increasing the blur. There are specially designed tapers, such as Butterworth. (see https://en.wikipedia.org/wiki/Butterworth_filter)
I have an expanded version of the FFT documentation from ImageMagick at http://www.fmwconcepts.com/imagemagick/fourier_transforms/fourier.html (Note some of the Jinc filtering is a bit outdated. Since I wrote that, Imagemagick implemented the Jinc function within -fx)
Here is a small set of commands to do it all in Unix syntax. Remove the +write ring.png if you do not want it to be created. This code is limited to square images.
ImageMagick 6:
inner=3
outer=40
infile="lena-1.png"
cent=`convert "$infile" -format "%[fx:floor((w-1)/2)]" info:`
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
convert "$infile" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate $cent,$cent circle 0,0 0,$outer" \
-fill black -draw "translate $cent,$cent circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
${inname}_bandpass_${inner}_${outer}.$suffix
ImageMagick 7 (only one command line):
inner=3
outer=40
infile="lena-1.png" \
magick "$infile" \
-set option:cent "%[fx:floor((w-1)/2)]" \
-set filename:fn "%t_bandpass_${inner}_${outer}.%e" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate "%[cent],%[cent]" circle 0,0 0,$outer" \
-fill black -draw "translate "%[cent],%[cent]" circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
"%[filename:fn]"
If you mean band enhanced (band boost) and not band pass, then you add the result back with the original (-compose plus -composite). In ImageMagick 6, that would be:
inner=3
outer=40
infile="lena-1.png"
cent=`convert "$infile" -format "%[fx:floor((w-1)/2)]" info:`
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
convert "$infile" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate $cent,$cent circle 0,0 0,$outer" \
-fill black -draw "translate $cent,$cent circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift "$infile" -compose plus -composite \
${inname}_bandenhance_${inner}_${outer}.$suffix
These are different results from what I get with those settings in ImageJ. Unfortunately, I do not know what they are doing. The ImageJ results look more like low pass filtering to me than what I know as band enhanced/band pass. See https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&cad=rja&uact=8&ved=2ahUKEwjJvoWD6L7eAhXJslQKHf1jArgQFjALegQICBAC&url=https%3A%2F%2Fcanvas.instructure.com%2Ffiles%2F6907524%2Fdownload%3Fdownload_frd%3D1&usg=AOvVaw2ws15jPD6C2-yAkfHmHYMH and https://www.scribd.com/doc/51981950/Frequency-Domain-Bandpass-Filtering-for-Image-Processing
In ImageJ, perhaps they are using a Butterworth filter or larger Gaussian blur. Or perhaps they are only processing the intensity channel from say HSI or HSV or LAB.
Related
Can ImageMagick generate multiple outputs from one input?
I'm running this from the command line: magick.exe input.png -shave '1x0' output_%d.png magick.exe input.png -shave '2x0' output_%d.png magick.exe input.png -shave '3x0' output_%d.png magick.exe input.png -shave '4x0' output_%d.png magick.exe input.png -shave '5x0' output_%d.png magick.exe input.png -shave '0x1' output_%d.png magick.exe input.png -shave '0x2' output_%d.png magick.exe input.png -shave '0x3' output_%d.png magick.exe input.png -shave '0x4' output_%d.png magick.exe input.png -shave '0x5' output_%d.png The first command creates output_0.png but the following commands overwrite the same file. Is there a single command that could generate output_0.png to output_9.png instead? The ImageMagick documentation says: Filename References Optionally, use an embedded formatting character to write a sequential image list. Suppose our output filename is image-%d.jpg and our image list includes 3 images. You can expect these images files to be written: image-0.jpg image-1.jpg image-2.jpg That's the closest evidence I found it's possible to do what I'm looking for in ImageMagick. It's not clear to me if I need to leverage shell scripting to do this or if ImageMagick provides a command line feature.
With ImageMagick you can run multiple operations on separate instances of the input image in a single command by cloning the input and isolating the operations inside parentheses like this... magick input.png \ \( -clone 0 -shave '1x0' \) \ \( -clone 0 -shave '2x0' \) \ \( -clone 0 -shave '3x0' \) \ \( -clone 0 -shave '4x0' \) \ \( -clone 0 -shave '5x0' \) \ \( -clone 0 -shave '0x1' \) \ \( -clone 0 -shave '0x2' \) \ \( -clone 0 -shave '0x3' \) \ \( -clone 0 -shave '0x4' \) \ \( -clone 0 -shave '0x5' \) \ -delete 0 output_%02d.png That will create 10 output images, each with a sequential filename with the number padded to two places, like "output_00.png ... output_10.png". To convert this to Windows CMD syntax you can remove all the backslashes that escape the parentheses, and replace the continued-line backslashes "\" with carets "^". EDITED TO ADD: There are many ways to accomplish this task with ImageMagick. Here is another example command that would produce the same results, but it uses FX expressions so it will only work in IMv7. (The above command should work with IMv6 by changing "magick" to "convert".) magick input.png -duplicate 9 -shave "%[fx:t<5?t+1:0]x%[fx:t>4?t-4:0]" output_%02d.png This reads the input and duplicates it 9 times, then uses FX expressions as arguments to the -shave operation so it can step through all 10 images, shaving each according to the formula in the FX expression.
As #GeeMack points out, there are many ways of doing this with ImageMagick and I was inspired to try a couple of other methods by his marvellous FX expression - just for fun! Here's what I was originally proposing: magick input.png -write MPR:orig \ -shave 1x -write out_1.png \ -shave 1x -write out_2.png \ -shave 1x -write out_3.png \ -shave 1x -write out_4.png \ -shave 1x -write out_5.png \ -delete 0--1 \ MPR:orig \ -shave x1 -write out_6.png \ -shave x1 -write out_7.png \ -shave x1 -write out_8.png \ -shave x1 -write out_9.png \ -shave x1 out_10.png It loads the input image and saves a copy in an MPR or "Magick Persistent Register" called orig. It then shaves a pixel off left and right sides and writes out_1.png, then shaves a further pixel off left and right sides and saves in out_2.png and continues till left and right are shaved by 5 pixels. It then reloads the original from the MPR and shaves off the top and bottom five times. With a 1080p image, i.e. 1920x1080, this takes 3.4s and uses 96MB of RAM. By comparison, GeeMack's takes 3.5s on my machine and uses 291MB of RAM. I then parallelised the creation of the left-right shaving with the top-bottom shaving as follows: magick input.png \ -shave 1x -write out_1.png \ -shave 1x -write out_2.png \ -shave 1x -write out_3.png \ -shave 1x -write out_4.png \ -shave 1x out_5.png & magick input.png \ -shave x1 -write out_6.png \ -shave x1 -write out_7.png \ -shave x1 -write out_8.png \ -shave x1 -write out_9.png \ -shave x1 out_10.png & wait That takes just 1.97s and peaks at 68MB of RAM. I think GeeMack's solution is probably simplest and most concise, for most cases, but there may be some mileage in some of the ideas here for some situations, i.e. probably larger images. In case anyone is interested how to measure the peak RAM usage, I used this: /usr/bin/time -l ./go 1.97 real 6.01 user 2.48 sys 68354048 maximum resident set size 0 average shared memory size 0 average unshared data size 0 average unshared stack size 10343 page reclaims 0 page faults 0 swaps ... ...
How to divide a heightmap into several layers with ImageMagick?
Let's say I have got a grayscale heightmap that has colors ranging from A (rather dark) to B (rather white). The map is not normalized, so the lowest value isn't pitch black and the highest one probably also isn't fully white. Let's also say 0 means black and 1 means white. What I want to do is to divide the image into several seperate images based on height. Every image has a black background. This would for example mean: Image 1 contains all the image content between 0 and 0.2, with anything above that being reduced to 0.2. Image 2 contains everything between 0.2 and 0.4, everything below 0.2 is black. Image 3 is the same between 0.4 and 0.6, and all this goes up to 1. You get the idea. Do you know any way to automate this process with ImageMagick? If not, is there any other way I could do this? Thanks
If you want to slice the image at different heights, then you can do that using a combination of -black-threshold and -white-threshold using percents rather than fractions in ImageMagick. The following will keep each range of gray levels and make the rest black. Black threshold keeps everything above a value and makes the rest black. White threshold keeps everything below a value and makes the rest white. So after the white threshold, we just change white to black. Unix syntax for IM 6. If using IM 7, change convert to magick Input: (Create a gradient image for demonstration) convert -size 256x256 gradient: grad.png convert grad.png -write mpr:grad +delete \ \( mpr:grad -white-threshold 20% -fill black -opaque white +write t1.png \) \ \( mpr:grad -black-threshold 20% -white-threshold 40% -fill black -opaque white +write t2.png \) \ \( mpr:grad -black-threshold 40% -white-threshold 60% -fill black -opaque white +write t3.png \) \ \( mpr:grad -black-threshold 60% -white-threshold 80% -fill black -opaque white +write t4.png \) \ \( mpr:grad -black-threshold 80% +write t5.png \) \ null: Results: ADDITION Based upon your comment, the code should be changed as follows: convert grad.png -write mpr:grad +delete \ \( mpr:grad -white-threshold 20% -fill "gray(20%)" -opaque white +write t1.png \) \ \( mpr:grad -black-threshold 20% -white-threshold 40% -fill "gray(40%)" -opaque white +write t2.png \) \ \( mpr:grad -black-threshold 40% -white-threshold 60% -fill "gray(60%)" -opaque white +write t3.png \) \ \( mpr:grad -black-threshold 60% -white-threshold 80% -fill "gray(80%)" -opaque white +write t4.png \) \ \( mpr:grad -black-threshold 80% +write t5.png \) \ null: Results:
faster imagemagick caption drawing
My project involve finding boxes in image and checking what inside them. For debug and proof purpose, I have to plot captions on the pages. The resulting imagemagick command looks like : magick Q_College-001.dist.png -colorspace sRGB -stroke none -strokewidth 1 -background "rgba(0,255,0,0.3)" -size 37.8x29.4 caption:'84-1' -geometry +200.6+125.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 40.6x29.4 caption:'87-2' -geometry +519.2+125.8 -compose over -composite \ -background "rgba(0,255,0,0.3)" -size 53.2x30.8 caption:'317-3' -geometry +538.4+287.6 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x29.4 caption:'322-4' -geometry +639.2+287.8 -compose over -composite \ -background "rgba(0,255,0,0.3)" -size 54.6x29.4 caption:'463-5' -geometry +535.2+334.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x29.4 caption:'479-6' -geometry +638.2+337.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 53.2x29.4 caption:'605-7' -geometry +535.4+371.8 -compose over -composite -background "rgba(0,255,0,0.3)" -size 53.2x29.4 caption:'601-8' -geometry +637.4+370.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x28 caption:'728-9' -geometry +536.2+437 -compose over -composite -background "rgba(255,0,0,0.3)" -size 53.2x29.4 caption:'744-10' -geometry +636.4+438.8 -compose over -composite \ -background "rgba(0,255,0,0.3)" -size 54.6x30.8 caption:'999-11' -geometry +537.2+531.6 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x30.8 caption:'1005-12' -geometry +636.2+531.6 -compose over -composite -background "rgba(0,255,0,0.3)" -size 54.6x29.4 caption:'1483-13' -geometry +534.2+748.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x29.4 caption:'1489-14' -geometry +631.2+748.8 -compose over -composite \ -background "rgba(0,255,0,0.3)" -size 56x32.2 caption:'1595-15' -geometry +534+782.4 -compose over -composite -background "rgba(255,0,0,0.3)" -size 53.2x29.4 caption:'1589-16' -geometry +630.4+782.8 -compose over -composite \ -background "rgba(0,255,0,0.5)" -size 53.2x29.4 caption:'1762-17' -geometry +534.4+877.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x30.8 caption:'1767-18' -geometry +631.2+877.6 -compose over -composite -background "rgba(0,255,0,0.3)" -size 53.2x29.4 caption:'1837-19' -geometry +535.4+928.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 53.2x29.4 caption:'1827-20' -geometry +630.4+926.8 -compose over -composite -background "rgba(255,0,0,0.3)" -size 54.6x29.4 caption:'1890-21' -geometry +536.2+977.8 -compose over -composite \ -background "rgba(0,255,0,0.3)" -size 51.8x30.8 caption:'1886-22' -geometry +628.6+976.6 -compose over -composite -background "rgba(0,255,0,0.5)" -size 80.8x32 caption:'194-23' -geometry +878.1+221 -compose over -composite \ -background "rgba(0,255,0,0.5)" -size 72x32 caption:'198-24' -geometry +1091+221 -compose over -composite -background "rgba(0,255,0,0.5)" -size 80x32.8 caption:'189-25' -geometry +1291+220.1 -compose over -composite \ -background "rgba(0,255,0,0.5)" -size 80.8x44.8 caption:'276-26' -geometry +878.1+262.6 -compose over -composite -background "rgba(0,255,0,0.5)" -size 72x44.8 caption:'280-27' -geometry +1091+262.6 -compose over -composite \ -background "rgba(0,255,0,0.5)" -size 80x44 caption:'286-28' -geometry +1291+262.5 -compose over -composite -background "rgba(255,0,0,0.5)" -size 81.6x44 caption:'418-29' -geometry +878.2+318.5 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 72x44.8 caption:'404-30' -geometry +1091+317.6 -compose over -composite -background "rgba(255,0,0,0.5)" -size 79.2x44.8 caption:'411-31' -geometry +1291.9+317.6 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 81.6x45.6 caption:'558-32' -geometry +878.2+373.7 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 72x45.6 caption:'563-33' -geometry +1091+373.7 -compose over -composite -background "rgba(255,0,0,0.5)" -size 79.2x44.8 caption:'570-34' -geometry +1291.9+373.6 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 81.6x32.8 caption:'695-35' -geometry +878.2+429.1 -compose over -composite -background "rgba(0,255,0,0.5)" -size 72x31.2 caption:'701-36' -geometry +1091+428.9 -compose over -composite \ -background "rgba(0,255,0,0.5)" -size 80x32.8 caption:'691-37' -geometry +1291+428.1 -compose over -composite -background "rgba(255,0,0,0.5)" -size 80.8x31.2 caption:'869-38' -geometry +878.1+468.9 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 72x32 caption:'859-39' -geometry +1091+468 -compose over -composite -background "rgba(0,255,0,0.5)" -size 80x32 caption:'865-40' -geometry +1291+468 -compose over -composite -background "rgba(255,0,0,0.5)" -size 80.8x32 caption:'952-41' -geometry +878.1+508 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 72x32 caption:'957-42' -geometry +1091+508 -compose over -composite -background "rgba(255,0,0,0.5)" -size 80x32 caption:'948-43' -geometry +1291+507 -compose over -composite -background "rgba(255,0,0,0.5)" -size 80.8x57.6 caption:'1069-44' -geometry +878.1+551.2 -compose over -composite -background "rgba(255,0,0,0.5)" -size 72x57.6 caption:'1072-45' -geometry +1091+551.2 -compose over -composite -background "rgba(255,0,0,0.5)" -size 80x58.4 caption:'1063-46' -geometry +1291+550.3 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 80.8x44.8 caption:'1193-47' -geometry +878.1+621.6 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 72x44.8 caption:'1198-48' -geometry +1091+621.6 -compose over -composite \ -background "rgba(255,0,0,0.5)" -size 80x44.8 caption:'1203-49' -geometry +1291+621.6 -compose over -composite -background "rgba(0,255,0,0.3)" -size 53.2x29.4 caption:'1331-50' -geometry +1202.4+688.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 53.2x29.4 caption:'1326-51' -geometry +1304.4+687.8 -compose over -composite -background "rgba(0,255,0,0.3)" -size 54.6x29.4 caption:'1403-52' -geometry +1201.2+722.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 54.6x29.4 caption:'1397-53' -geometry +1306.2+721.8 -compose over -composite -background "rgba(0,255,0,0.3)" -size 53.2x29.4 caption:'1685-54' -geometry +1204.4+835.8 -compose over -composite \ -background "rgba(255,0,0,0.3)" -size 51.8x28 caption:'1691-55' -geometry +1301.6+836 -compose over -composite Q_College-001.dist.ans.png It takes more than 30 sec to write the resulting image (PNG is 1500x , can't be smaller for box computing...). Is there a way to obtain the result faster ? I try to remove -compose over -composite but the concerned caption don't print..... Thanks for your help Michel
If I were writing this command, simply for clarity, I'd probably individually build each caption and set its paging geometry inside a set of parentheses, then composite all of them onto the input image all at once at the end with "-flatten". magick Q_College-001.dist.png -colorspace sRGB -stroke none -strokewidth 1 \ \( -background "rgba(0,255,0,0.3)" -size 37.8x29.4 caption:'84-1' -set page +200.6+125.8 \) \ \( -background "rgba(255,0,0,0.3)" -size 40.6x29.4 caption:'87-2' -set page +519.2+125.8 \) \ ... \( -background "rgba(0,255,0,0.3)" -size 53.2x29.4 caption:'1685-54' -set page +1204.4+835.8 \) \ \( -background "rgba(255,0,0,0.3)" -size 51.8x28 caption:'1691-55' -set page +1301.6+836 \) \ -flatten Q_College-001.dist.ans.png On my moderate speed Windows 10 machine the full command runs in about 7 seconds with or without those modifications.
thanks again for help. I share a totally different (and ways faster) approach. The only drawback I found is not using -caption, which means I have to fix a standard font-size for text. In my case, this is not a big issue. If somebody knows how to emulate -caption in SVG/MVG... magick source.png -colorspace sRGB -draw " fill rgba(255,0,0,0.3) rectangle 200.6,125.8 238.4,155.2 rectangle 639.2,287.8 693.8,317.2 rectangle 638.2,337.8 692.8,367.2 rectangle 535.4,371.8 588.6,401.2 rectangle 636.4,438.8 689.6,468.2 rectangle 636.2,531.6 690.8,562.4 rectangle 631.2,748.8 685.8,778.2 rectangle 630.4,782.8 683.6,812.2 rectangle 631.2,877.6 685.8,908.4 rectangle 630.4,926.8 683.6,956.2 rectangle 536.2,977.8 590.8,1007.2 rectangle 1202.4,688.8 1255.6,718.2 rectangle 1201.2,722.8 1255.8,752.2 rectangle 1204.4,835.8 1257.6,865.2 fill rgba(0,255,0,0.3) rectangle 519.2,125.8 559.8,155.2 rectangle 535.2,334.8 589.8,364.2 rectangle 637.4,370.8 690.6,400.2 rectangle 537.2,531.6 591.8,562.4 rectangle 534.2,748.8 588.8,778.2 rectangle 535.4,928.8 588.6,958.2 rectangle 628.6,976.6 680.4,1007.4 rectangle 1304.4,687.8 1357.6,717.2 rectangle 1306.2,721.8 1360.8,751.2 rectangle 1301.6,836 1353.4,864 fill rgba(0,255,0,0.5) rectangle 538.4,287.6 591.6,318.4 rectangle 536.2,437 590.8,465 rectangle 534,782.4 590,814.6 rectangle 534.4,877.8 587.6,907.2 rectangle 878.1,221 958.9,253 rectangle 1091,221 1163,253 rectangle 878.1,262.6 958.9,307.4 rectangle 1091,262.6 1163,307.4 rectangle 1291,428.1 1371,460.9 fill rgba(255,0,0,0.5) rectangle 1291,220.1 1371,252.9 rectangle 1291,262.5 1371,306.5 rectangle 878.2,318.5 959.8,362.5 rectangle 1091,317.6 1163,362.4 rectangle 1291.9,317.6 1371.1,362.4 rectangle 878.2,373.7 959.8,419.3 rectangle 1091,373.7 1163,419.3 rectangle 1291.9,373.6 1371.1,418.4 rectangle 878.2,429.1 959.8,461.9 rectangle 1091,428.9 1163,460.1 rectangle 878.1,468.9 958.9,500.1 rectangle 1091,468 1163,500 rectangle 1291,468 1371,500 rectangle 878.1,508 958.9,540 rectangle 1091,508 1163,540 rectangle 1291,507 1371,539 rectangle 878.1,551.2 958.9,608.8 rectangle 1091,551.2 1163,608.8 rectangle 1291,550.3 1371,608.7 rectangle 878.1,621.6 958.9,666.4 rectangle 1091,621.6 1163,666.4 rectangle 1291,621.6 1371,666.4 fill darkblue font-size 13 text 200.6,135.8'84-1' text 519.2,135.8'87-2' text 538.4,297.6'317-3' text 639.2,297.8'322-4' text 535.2,344.8'463-5' text 638.2,347.8'479-6' text 535.4,381.8'605-7' text 637.4,380.8'601-8' text 536.2,447'728-9' text 636.4,448.8'744-10' text 537.2,541.6'999-11' text 636.2,541.6'1005-12' text 534.2,758.8'1483-13' text 631.2,758.8'1489-14' text 534,792.4'1595-15' text 630.4,792.8'1589-16' text 534.4,887.8'1762-17' text 631.2,887.6'1767-18' text 535.4,938.8'1837-19' text 630.4,936.8'1827-20' text 536.2,987.8'1890-21' text 628.6,986.6'1886-22' text 878.1,231'194-23' text 1091,231'198-24' text 1291,230.1'189-25' text 878.1,272.6'276-26' text 1091,272.6'280-27' text 1291,272.5'286-28' text 878.2,328.5'418-29' text 1091,327.6'404-30' text 1291.9,327.6'411-31' text 878.2,383.7'558-32' text 1091,383.7'563-33' text 1291.9,383.6'570-34' text 878.2,439.1'695-35' text 1091,438.9'701-36' text 1291,438.1'691-37' text 878.1,478.9'869-38' text 1091,478'859-39' text 1291,478'865-40' text 878.1,518'952-41' text 1091,518'957-42' text 1291,517'948-43' text 878.1,561.2'1069-44' text 1091,561.2'1072-45' text 1291,560.3'1063-46' text 878.1,631.6'1193-47' text 1091,631.6'1198-48' text 1291,631.6'1203-49' text 1202.4,698.8'1331-50' text 1304.4,697.8'1326-51' text 1201.2,732.8'1403-52' text 1306.2,731.8'1397-53' text 1204.4,845.8'1685-54' text 1301.6,846'1691-55' " result.jpg
How to create a simple reflection using imagemagick with dynamic image sizing?
I've trying to use imagemagick to create a simple reflection, however the documentation has fixed sizes. I've tried to read in the height and width and use those variables but this doesn't produce a reflection. Here's the documentation http://www.imagemagick.org/Usage/advanced/ Here's the sample code convert pokemon.gif \( +clone -flip \) -append \ -size 100x100 xc:black +swap \ -gravity North -geometry +0+5 -composite reflect_perfect.png Here's my bash script, with my widths and heights... #!/bin/bash infile="framed.png" ww=`convert $infile -format "%w" info:` hh=`convert $infile -format "%h" info:` convert $infile -alpha on \ \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \ -size ${ww}x${hh} xc:black +swap \ -gravity North -geometry +0+5 -composite reflect_alpha.png My resulting image is exactly the same as the source image. Here's the exact image I'm using https://www.dropbox.com/s/l8gtieuqi1yoipm/iPhoneXR-4-categories_framed.png?dl=0
The size for the black background must be larger than twice the height of the input and at least as wide as the input. So I would do the following in Imagemagick Input: infile="zelda1.jpg" ww=`convert $infile -format "%[fx:1.5*w]" info:` hh=`convert $infile -format "%[fx:2.1*h]" info:` convert $infile -alpha on \ \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \ -size ${ww}x${hh} xc:black +swap \ -gravity North -geometry +0+5 -composite reflect_alpha.png But you can try my bash unix Imagemagick shell script, 3Dreflection at http://www.fmwconcepts.com/imagemagick/index.html, if you want more flexibility. ADDITION: To answer your question, it does not matter if PNG or JPG. The issue is that you have transparency. If you put a transparent background, then infile="WPB-wtpC.png" ww=`convert $infile -format "%[fx:1.5*w]" info:` hh=`convert $infile -format "%[fx:2.1*h]" info:` convert $infile \ \( +clone -flip -alpha on -channel A -evaluate multiply .35 +channel +write tmp1.png \) -append +write tmp2.png \ -size ${ww}x${hh} xc:none +swap \ -gravity North -geometry +0+5 -compose over -composite reflect_alpha.png If you use a black background, then infile="WPB-wtpC.png" ww=`convert $infile -format "%[fx:1.5*w]" info:` hh=`convert $infile -format "%[fx:2.1*h]" info:` convert $infile \ \( +clone -flip -alpha on -channel A -evaluate multiply .35 +channel +write tmp1.png \) -append +write tmp2.png \ -size ${ww}x${hh} xc:black +swap \ -gravity North -geometry +0+5 -compose over -composite reflect_alpha.png NOTE: I had a typo in the first zelda image code. I accidentally typed w rather than h in the hh equation, which I have now fixed. That may have messed you up.
Weird Behaviour with New Lines Using grunt-exec
I am using ImageMagick and grunt-exec to generate a favicon for a website I am working on using the command found in the ImageMagick documentation. convert image.png -bordercolor white -border 0 \ \( -clone 0 -resize 16x16 \) \ \( -clone 0 -resize 32x32 \) \ \( -clone 0 -resize 48x48 \) \ \( -clone 0 -resize 64x64 \) \ -delete 0 -alpha off -colors 256 favicon.ico However I am getting some issues with line breaks which I think is partially because I do not fully understand what I should do with the line breaks. In my Gruntfile.js I am currently using no line breaks and it works as expected. Notice that I had to remove all the line breaks and double escape the parentheses because apparently grunt-exec parses the string before it executes it. exec: { favicon: 'convert _favicon.svg -bordercolor white -border 0 \\( -clone 0 -resize 16x16 \\) \\( -clone 0 -resize 32x32 \\) \\( -clone 0 -resize 48x48 \\) \\( -clone 0 -resize 64x64 \\) -delete 0 -alpha off -colors 256 favicon.ico' } Like I said, I have it working right now but I would like to be able to use line breaks for readability and also because I would like to fully understand what is going on here. So far I have tried adding an extra \ and leaving everything the same, replacing the new lines with \n or \\n and putting everything on the same line but no luck.
The solution I was looking for turned out to be to use \n\ for new lines, like this: convert image.png -bordercolor white -border 0 \n\ \( -clone 0 -resize 16x16 \) \n\ \( -clone 0 -resize 32x32 \) \n\ \( -clone 0 -resize 48x48 \) \n\ \( -clone 0 -resize 64x64 \) \n\ -delete 0 -alpha off -colors 256 favicon.ico
Try using this: exec: { favicon: 'convert _favicon.svg -bordercolor white -border 0 "( -clone 0 -resize 16x16 )" "( -clone 0 -resize 32x32 )" "( -clone 0 -resize 48x48 )" "( -clone 0 -resize 64x64 )" -delete 0 -alpha off -colors 256 favicon.ico' }