How to Write a Bash Script That Cuts Images into Pieces Using Image Magick

How to write a bash script that cuts images into pieces using image magick?

I believe you've got the position and size swapped. Try:

convert 'input.png[48x48+0+0]' output.png

The third image would be:

convert 'input.png[48x48+96+0]' output.png

Or

convert 'input.png[48x48+0+96]' output.png

Using imagemagick how can i slice up an image into several separate images?

If each area has the same amount of padding around it, you can use the @ operator.

This cuts an image into 6 sections, 2 per row, with 40 pixels of horizontal padding and 20 pixels of vertical padding excluded from each section:

convert image.png -crop 2x3-40-20@ +repage +adjoin tile-%d.jpg

How to trim transparency from multiple images but still keep relative placement in Image Magick

Ok, got it. The trick is to get ImageMagick to run the trim operation of the largest image (the glow in my case), but instead of outputting an image, simply output the trim parameters instead.

Then, feed this back into a crops operation on each image, like this:

convert Penguin.png  -crop `convert PenguinGlow.png  -trim -format '%wx%h%O' info:` +repage PenguinTrimmed.png

convert PenguinDirt.png -crop `convert PenguinGlow.png -trim -format '%wx%h%O' info:` +repage PenguinDirtTrimmed.png

convert PenguinGlow.png -crop `convert PenguinGlow.png -trim -format '%wx%h%O' info:` +repage PenguinGlow.png

ImageMagick crop huge image

After a lot more digging and some help from the guys on the ImageMagick forum I managed to get it working.

The trick to getting it working is the .mpc format. Since this is the native image format used by ImageMagick it does not need to convert the initial image, it just cuts out the piece that it needs. This is the case with the second script I setup.

Lets say you have a 50000x50000 .tif image called myLargeImg.tif. First convert it to the native image format using the following command:

 convert -monitor -limit area 2mb myLargeImg.tif myLargeImg.mpc

Then, run the bellow bash script that will create the tiles. Create a file named tiler.sh in the same folder as the mpc image and put the below script:

 #!/bin/bash
src=$1
width=`identify -format %w $src`
limit=$[$width / 256]
echo "count = $limit * $limit = "$((limit * limit))" tiles"
limit=$((limit-1))
for x in `seq 0 $limit`; do
for y in `seq 0 $limit`; do
tile=tile-$x-$y.png
echo -n $tile
w=$((x * 256))
h=$((y * 256))
convert -debug cache -monitor $src -crop 256x256+$w+$h $tile
done
done

In your console/terminal run the below command and watch the tiles appear one at at time into your folder.

 sh ./tiler.sh myLargeImg.mpc

How to crop a image into several rectangular grids using imagemagick

I have no idea what an Instagram grid is or what size constraints it might have, but if you have an image like this:

Sample Image

You can divide it into a grid, 3 tiles wide by 2 high like this:

magick input.jpg -crop 3x2@ tile-%d.png

And here are the 6 tiles:

-rw-r--r--@ 1 mark  staff   62199  2 Jun 16:26 tile-0.png
-rw-r--r--@ 1 mark staff 75180 2 Jun 16:26 tile-1.png
-rw-r--r--@ 1 mark staff 69615 2 Jun 16:26 tile-2.png
-rw-r--r--@ 1 mark staff 108443 2 Jun 16:26 tile-3.png
-rw-r--r--@ 1 mark staff 121714 2 Jun 16:26 tile-4.png
-rw-r--r--@ 1 mark staff 121384 2 Jun 16:26 tile-5.png

Sample Image

If you are cropping into lots of smaller parts, you are better using a zero-padded tile name like this so that they occur listed in order if you wish to re-assemble them.:

magick input.jpg -crop 5x4@ tile-%04d.png

Sample Image

-rw-r--r--  1 mark  staff   5976  2 Jun 16:33 tile-0000.png
-rw-r--r-- 1 mark staff 15138 2 Jun 16:33 tile-0001.png
-rw-r--r-- 1 mark staff 17625 2 Jun 16:33 tile-0002.png
-rw-r--r-- 1 mark staff 15640 2 Jun 16:33 tile-0003.png
-rw-r--r-- 1 mark staff 12695 2 Jun 16:33 tile-0004.png
-rw-r--r-- 1 mark staff 30138 2 Jun 16:33 tile-0005.png
-rw-r--r-- 1 mark staff 32371 2 Jun 16:33 tile-0006.png
-rw-r--r-- 1 mark staff 30280 2 Jun 16:33 tile-0007.png
-rw-r--r-- 1 mark staff 33469 2 Jun 16:33 tile-0008.png
-rw-r--r-- 1 mark staff 29507 2 Jun 16:33 tile-0009.png
-rw-r--r-- 1 mark staff 34697 2 Jun 16:33 tile-0010.png
-rw-r--r-- 1 mark staff 36322 2 Jun 16:33 tile-0011.png
-rw-r--r-- 1 mark staff 36616 2 Jun 16:33 tile-0012.png
-rw-r--r-- 1 mark staff 40337 2 Jun 16:33 tile-0013.png
-rw-r--r-- 1 mark staff 37466 2 Jun 16:33 tile-0014.png
-rw-r--r-- 1 mark staff 30444 2 Jun 16:33 tile-0015.png
-rw-r--r-- 1 mark staff 36170 2 Jun 16:33 tile-0016.png
-rw-r--r-- 1 mark staff 39400 2 Jun 16:33 tile-0017.png
-rw-r--r-- 1 mark staff 38850 2 Jun 16:33 tile-0018.png
-rw-r--r-- 1 mark staff 36439 2 Jun 16:33 tile-0019.png

imagemagick: crop one image to four not equal size parts, but but keep original canvas size and paint background transparent

Note: Since the image you're probably working with is not the image you posted, you will need to modify this code to suit your purposes.

#!/bin/bash

width=$(convert lena.png -format "%w" info:)
height=$(convert lena.png -format "%h" info:)

# Get the Percentage of the Width
pct_w() {
echo $(($1*$width/100))
}

# Get the Percentage of the Height
pct_h() {
echo $(($1*$height/100))
}

# Top-Left
convert lena.png -crop $(pct_w 33)x$(pct_h 50)+0+0 +adjoin top-left.miff
convert top-left.miff -background transparent -flatten top-left.png

# Top-Right
convert lena.png -crop $(pct_w 66)x$(pct_h 50)+$(pct_w 33)+0 +adjoin top-right.miff
convert top-right.miff -background transparent -flatten top-right.png

# Bottom-Left
convert lena.png -crop $(pct_w 65)x$(pct_h 50)+0+$(pct_h 50) +adjoin bottom-left.miff
convert bottom-left.miff -background transparent -flatten bottom-left.png

# Bottom-Right
convert lena.png -crop $(pct_w 35)x$(pct_h 50)+$(pct_w 65)+$(pct_h 50) +adjoin bottom-right.miff
convert bottom-right.miff -background transparent -flatten bottom-right.png

rm *.miff

There are two helper functions to calculate percentages for Width and Height. In the code $(pct_w 33) this refers to 33% of the width. Change these values accordingly until you get the cuts you want.

Using Image::Magick to split an image into smaller chunks and get relative position of each chunk

I solved it the only way i know how: Screw perlmagic, and do it via command line instead. The below script works on both rectangular and square images. Index is printed to the screen.

use warnings;
use strict;

my $size = '512x512';
my $offset = 512;

unless ($ARGV[0]) { die "Missing filename as arg" }
unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }

my ($newfile, undef) = split(/\./,$ARGV[0]);
system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");

my @files = glob($newfile . "_*");
@files = sort(@files);

my (undef, undef, $origsize) = split(/\s+/,`identify $ARGV[0]`);
my ($maxX, $maxY) = split(/x/,$origsize);

$maxX /= $offset;
$maxY /= $offset;

my $x = 0;
my $y = 0;
foreach my $file (@files)
{
print "$file\t" . $x * $offset . "\t" . $y * $offset . "\n";
$x++;

if ($x >= $maxX)
{
$x = 0;
$y++;
}
}

__END__


Related Topics



Leave a reply



Submit