Imagemagick: 이미지를 아래쪽에서 세로로 분할하고 마지막 부분의 크기를 조정합니다.

Imagemagick: 이미지를 아래쪽에서 세로로 분할하고 마지막 부분의 크기를 조정합니다.

이미지를 128x 크기로 분할하고 싶나요? 128x128 크기의 여러 부분으로 나누어 마지막 부분의 높이를 128로 조정했습니다. 첫 번째 출력 이미지가 입력 이미지의 맨 아래부터 나오길 원합니다.

나는 사용했다

convert -gravity south -crop 128x128 +repage untitled.png cropped_%d.png

불행하게도 중력 옵션은 무시됩니다. Cropped_0.png가 상단 부분입니다. 또한 마지막 이미지의 크기를 조정하는 방법을 모르겠습니다.

편집: 다음은 하단부터 시작하여 Cropped_0.png로 끝나지만 Cropped_1.png는 아닙니다.

convert untitled.png -gravity South +repage -crop 128x128+0+0 +repage cropped_%d.png

답변1

이제 이것을 사용하십시오 :

#!/usr/bin/python3.9

import numpy as np

import cv2

import sys
import os
import math

import argparse
parser = argparse.ArgumentParser(description="split png image vertically from bottom")
parser.add_argument("fname", help="img file name")
parser.add_argument("prefix", help="prefix of output pngs")
parser.add_argument('--height', action='store_true', help="output img height. default 128")
parser.add_argument('--width', action='store_true', help="output img width. default 128")

args = parser.parse_args()
print(args.height)
print(args.fname)



abspath=os.path.abspath(args.fname)
absdir=os.path.dirname(abspath)

tarW = 128
if(args.width):
    tarW = args.width
tarH = 128
if(args.height):
    tarH = args.height

print(tarH)

img = cv2.imread(abspath, cv2.IMREAD_UNCHANGED)
if(img is not None):
    height=img.shape[0]
    width=img.shape[1]
    fulls=math.floor(height/tarH)
    total=math.ceil(height/tarH)
    print("fulls:" + str(fulls))
    print("total:" + str(total))

    for i in range(0,fulls):
        ty=height-((i+1)*tarH)
        tx=0
        by=ty+tarH
        bx=tarW
        iname = args.prefix + "_" + str(i) + ".png"
        print(iname + ": cropping from " + str(tx) + "x" + str(ty) + " to " + str(bx) + "x" + str(by))
        oimg=img[ty:by,tx:bx]
        cv2.imshow("asd", oimg)
        cv2.waitKey()
        cv2.imwrite(absdir + "/" + iname, oimg)


    #top rest
    lty = 0
    lby = height%tarH
    ltx = 0
    lbx = tarW
    limg1=img[lty:lby,ltx:lbx]
    iname = args.prefix + "_" + str(fulls) + ".png"

    ydiff = tarH - lby
    print(iname + ": cropping from " + str(ltx) + "x" + str(lty) + " to " + str(lbx) + "x" + str(lby) +  ", missing " + str(ydiff) + "x" + str(tarW) + ". generating...")

    #additional transparent
    aw, ah = tarW, ydiff
    n_channels = 4
    transparent_top = np.zeros((ah, aw, n_channels), dtype=np.uint8)

    oimg = cv2.vconcat([transparent_top, limg1])

    cv2.imshow("asd", oimg)
    cv2.waitKey()
    cv2.imwrite(absdir + "/" +  iname, oimg)


else:
    print("not valid image")
    sys.exit(1)

답변2

ImageMagick은 위에서부터 시작해야 하기 때문에 한 가지 해결책은 자르기 전에 이미지를 180도 회전하고 결과도 다시 회전하는 것입니다. 예를 들어:

# create example input image of 128x200 pixels
convert magick:wizard -geometry 128x200! untitled.png 
convert untitled.png -rotate 180 -crop 128x128 \
 +repage -extent 128x128 -rotate 180 cropped_%d.png

자르기_0.png자르기_1.png

관련 정보