画像を128倍のサイズに分割したいですか? 128×128サイズの複数の部分に分割し、最後の部分の高さを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)