わかった。ここで、私が言及したアイデアを簡単に突き刺します。
rebox() 関数は、オフセット データとともに「固定された」バウンディング ボックスを返します。
これはほとんどの状況で機能します。私はオフセットデータを統合しませんでしたが、そのいくつかのバージョンはおそらくセクションに入るでしょうi3.paste
.
テスト画像 grid.png は 300x300 で、50px に青い線、150px に赤い線、200px に緑の線があります。
これを正確なニーズに合わせて調整できるはずです。
import Image
i1 = Image.open('grid.png')
DEBUG = True
def rebox( box_original , box_crop_desired ):
box_crop_new= list( box_crop_desired )
box_crop_offset = [ 0 , 0 ]
if box_crop_desired[0] < 0:
box_crop_new[0] = 0
box_crop_offset[0] = box_crop_desired[0]
if box_crop_desired[1] < 0:
box_crop_new[1] = 0
box_crop_offset[1] = box_crop_desired[1]
if box_crop_desired[2] > box_original[2]:
box_crop_new[2] = box_original[2]
if box_crop_desired[3] > box_original[3]:
box_crop_new[3] = box_original[3]
box_crop_offset = tuple(box_crop_offset)
box_crop_new = tuple(box_crop_new)
if DEBUG :
print "box_original %s" % str(box_original)
print "box_crop_offset %s" % str(box_crop_offset)
print "box_crop_desired %s" % str(box_crop_desired)
print "box_crop_new %s" % str(box_crop_new)
return ( box_crop_new , box_crop_offset )
( newX , newY ) = ( 200 , 200 )
( newW , newH ) = ( 400 , 400 )
box_crop_desired = ( newX , newY , newX+newW, newY+newH )
( box_crop , box_crop_offset ) = rebox( i1.getbbox() , box_crop_desired )
i2 = i1.crop(box=box_crop)
i2.save('grid-out-b.png')
i3 = Image.new( 'RGBA' , ( newW , newH ) , (255,255,255) )
i3.paste( i2 , (0,0) )
i3.save('grid-out-final-b.png')