How to split an image with a grid and preserve transparency bounding box

坚强是说给别人听的谎言 提交于 2019-12-25 03:13:51

问题


I have some png images that I want to split it into parts, like by grid or size.

But each part should have the same bounding box (transparency) as original image.

Example:

Splitting image into 2 parts.

Original: 200 × 89

Output:


part_1.png, 200 × 89


part_2.png, 200 × 89

Can ImageMagick do this? Or any other app or method.

My actual goal is to split into 100+ slices images.


EDIT:

Another goal to have an indents for each slice. Say indent = 10px.

Example:

Input: 200 x 100


Output:


part_1.png, 200 x 100


part_2.png, 200 x 100

And just as example, to visually compare input and output: combined output images in Photoshop as layer added one onto another 200 x 100 :

Also this is showing input image added onto combined(so it's better to see what was cropped and how):


回答1:


In ImageMagick, you can split an image into many parts with the -crop command. For your example above with two parts, you can do that with the following commands. ImageMagick will append -0, -1 ... to the output file names.

ImageMagick 6:

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% \) -layers composite result.png


ImageMagick 7:

magick \( image.png -set option:dim "%wx%h" -crop 50x100% \) null: \( -size "%[dim]" xc:none \) -reverse -layers composite result.png


The results are:

See

http://www.imagemagick.org/Usage/crop/#crop http://www.imagemagick.org/Usage/crop/#crop_percent http://www.imagemagick.org/Usage/crop/#crop_tile http://www.imagemagick.org/Usage/crop/#crop_quad http://www.imagemagick.org/Usage/crop/#crop_equal

http://www.imagemagick.org/script/command-line-options.php#layers

Note that -crop keeps the virtual canvas information if you do not add +repage afterwards. So to put the individual images back into their original placement, you have to composite them onto a transparent background the size of the input. That is done in one command using -layers composite using the null: separator.




回答2:


To answer your new question, you can do that with a script loop. On a Unix-like platform, assuming your images do not have spaces, you can do the following:

cd path/to/current_folder
list=`ls *.png`
for img in $list; do
name=`convert $img -format "%t" info:`
dim=`convert $img -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( $img -crop 50x100% \) -layers composite -scene 1 path/to/new_folder/${name}_%d.png
done


If you want leading 0s in the output, say 3, use path/to/new_folder/${name}_%03d.png.

Note that to start with 1 rather than 0, I have added -scene 1.

Sorry, I do not know how to script for Windows.

Please always provide your ImageMagick version and platform.




回答3:


Here is another way to add transparent areas between parts of a crop in ImageMagick. Crop the image into pieces, chop off the parts you want to remove, then pipe to montage to add the spacing back.

Input:

Here I make this into a 4x4 grid of images with 10 pixel spacing:

convert lena.png -crop 25%x25% +repage -gravity east -chop 10x0 -gravity south -chop 0x10 +repage miff:- | montage - -background none -tile 4x4 -geometry +5+5 result.png




回答4:


In ImageMagick, the best way to put transparent areas into your image is with a binary mask that is put into the alpha channel of your image.

convert input.png \( -size 200x89 xc:white -size 10x89 xc:black -gravity center -composite \) -alpha off -compose copy_opacity -composite result.png


You can add as many blank areas as you want by adding more white areas to the mask or by tiling out one region of black and one region of white to create the mask with regular spacing of black and white.




回答5:


Edited to add this ImageMagick 6 example which splits the input image into 4 pieces, 25% of the original width and 100% of its height, then creates a transparent canvas for each piece the same dimensions of the input image, and locates the pieces at their original offsets on those canvases.

convert input.png -set option:distort:viewport %[w]x%[h] -crop 25x100% \
   -virtual-pixel none -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

The output file names will be numbered starting from zero like "out000.png", etc.

Original message...

Here's a simple command using ImageMagick 7 that can crop an image into any number of pieces, and output all the pieces at their original offsets on transparent backgrounds of the original input dimensions...

magick input.png -crop 100x1@ -background none \
   -extent "%[fx:s.page.width]x%[fx:s.page.height]-%[fx:s.page.x]-%[fx:s.page.y]" out%03d.png

That "-crop 100x1@" tells it to split the image into a grid 100 pieces wide by 1 piece high. You could just as well specify the crop sizes as percents or numbers of pixels.

Edited again to add:

This following command will split the input image into the individual pieces specified with the "-crop" operator, then shave 5 pixels from every side of each piece, then apply a 5 pixel transparent border to every side of each piece. It will still remember the original locations of the pieces within the input canvas, so the "-distort affine ..." can extend the canvases and place the pieces where they were in the input image.

convert input.png -set option:distort:viewport %[w]x%[h] \
   -bordercolor none -background none -virtual-pixel none \
   -crop 25x100% -shave 5x5 -border 5x5 \
   -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

To use this command with IM7 you need to change "convert" to "magick".




回答6:


Given the changes of requirements provided by Kamikaze, here is one way to achieve the split with indent in ImageMagick, assuming I understand correctly.

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% -shave 5x5 \) -geometry +5+5 -layers composite result.png

To check, I flatten over a blue background:

convert result-0.png result-1.png -background blue -flatten result.png



来源:https://stackoverflow.com/questions/50803478/how-to-split-an-image-with-a-grid-and-preserve-transparency-bounding-box

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!