如何在Python PIL中使用浮动像素大小缩放图像

如何在Python PIL中使用浮动像素大小缩放图像,python,image,python-imaging-library,Python,Image,Python Imaging Library,我将一个缓慢放大的图像粘贴到一个循环内的固定大小背景上,以创建一个图像缓慢放大的平滑视频 但是,我找不到一种方法,使缩放图像在像素之间增加insize,因为在调整图像大小之前,必须将浮动值转换为int,这会产生一种抖动效应,其中图像每隔3或4帧分别缩放一次像素,有时会分别提高高度和宽度,而不是平滑的抗锯齿比例,其中“像素之间”可以使用,并且无论增量有多小,都会逐帧进行缩放(就像3D游戏中的纹理) 当前帧

我将一个缓慢放大的图像粘贴到一个循环内的固定大小背景上,以创建一个图像缓慢放大的平滑视频

但是,我找不到一种方法,使缩放图像在像素之间增加insize,因为在调整图像大小之前,必须将浮动值转换为int,这会产生一种抖动效应,其中图像每隔3或4帧分别缩放一次像素,有时会分别提高高度和宽度,而不是平滑的抗锯齿比例,其中“像素之间”可以使用,并且无论增量有多小,都会逐帧进行缩放(就像3D游戏中的纹理)

当前帧<(fbi-混合帧):
#基于位置的轻微缩放
zoomPosition=-((fbi-blendingFrames-currentFrame)/Frames-Between-Images))+1#从0-1创建值
zoomScaleH=高度+((高度/20)*缩放组合)#除以高度
zoomScaleW=宽度+((宽度/20)*缩放组合)#除以宽度
#在这里转换为int意味着某些帧的大小没有增加
img_w,img_h=int(zoomScaleW),int(zoomScaleH)
outputimagezoompate=outputimageZoom.resize((img\u w,img\u h),Image.ANTIALIAS)
偏移量z=((宽度-img_w)//2,(高度-img_h)//2)
#将居中粘贴到固定大小的bk图像#
粘贴(outputimageZoomPaste,offsetZ)
#将帧写入视频
video.write(cv2.cvtColor(np.array(outputimage),cv2.COLOR\u RGB2BGR))
当前帧+=1

避免抖动的一种方法是在一次扩展和下一次扩展之间求平均值。例如,如果图像在第1、4、7、10帧等上仅以像素大小增加,则在第1帧上渲染图像1,在第2帧上渲染66%的图像1和33%的图像4,在第3帧上渲染33%的图像1和66%的图像4,在第4帧上渲染图像4。这使得运动不那么尖锐


这只是一种方法,但要点是一样的:我们只能以离散像素为单位增加图像大小,因此在像素之间创建渐变的唯一方法是混合传出和传入颜色

你可以通过自定义卷积来实现,但我认为PIL没有给你这种能力。我想写一个答案,根据增加背景的大小,粘贴新图像的全尺寸,然后缩小结果,但这会更慢,而且仍然会有一些问题。感谢我最终使用了这个理论,编写一个向前看的算法是一件棘手的事情,同时也是一场噩梦,即用奇数维获得正确的偏移量。但这是令人满意的
while currentFrame < (fbi - blendingFrames):
    #Slight zoom based on position
    zoomPosition = -(((fbi - blendingFrames - currentFrame) / framesbetweenImages)) + 1 #Creates value from 0 - 1 
    zoomScaleH = height+((height/20)*zoomPosition) #divide by height
    zoomScaleW = width+((width/20)*zoomPosition) #divide by width

    #converting to int here means some frames show no size increase
    img_w, img_h = int(zoomScaleW), int(zoomScaleH)
    outputimageZoomPaste = outputimageZoom.resize((img_w, img_h), Image.ANTIALIAS)

    offsetZ = ((width - img_w) // 2, (height - img_h) // 2)

    # Paste centered on to fixed size bk image #
    outputimage.paste(outputimageZoomPaste, offsetZ)

    #write frame to video
    video.write(cv2.cvtColor(np.array(outputimage), cv2.COLOR_RGB2BGR))
    currentFrame += 1