因此,我假设您只是想将两个图像彼此相乘,发现它们的大小不同?如果我误解了,请原谅我,但是这里有一些代码将一个图像的黑色像素放在另一个图像上,即使黑白图像比另一个图像小.
原始图像(painting.bmp和mask.bmp)
输出:
“ …实际上是第一幅图像(绘画)的新图像,只有第二幅图像中的黑色像素被覆盖在其顶部.” – 这是你想要的吗?
本质上,通过将较小的图像放在与第一个图像相同大小的空白图像的中心,该代码仅使较小的图像与第一个图像一样大.
import PIL
from PIL import Image
from PIL import ImageChops # used for multiplying images
# open images
painting = Image.open("painting.bmp")
mask = Image.open("mask.bmp")
def black_onto(img1, img2):
# create blank white canvas to put img2 onto
resized = Image.new("RGB", img1.size, "white")
# define where to paste mask onto canvas
img1_w, img1_h = img1.size
img2_w, img2_h = img2.size
box = (img1_w/2-img2_w/2, img1_h/2-img2_h/2, img1_w/2-img2_w/2+img2_w, img1_h/2-img2_h/2+img2_h)
# multiply new mask onto image
resized.paste(img2, box)
return ImageChops.multiply(img1, resized)
out = black_onto(painting, mask)
out.show() # this gives the output image shown above
的解释:(img1_w / 2-img2_w / 2,img1_h / 2-img2_h / 2,img1_w / 2-img2_w / 2 img2_w,img1_h / 2-img2_h / 2 img2_h)
好的,这有点丑陋,但实际上非常简单:框定义了画布上要放置蒙版的区域,即中心. box是一个4值元组,用于定义区域左上角和右下角的x和y,如下所示:(x1,y1,x2,y2).不是x,y和宽度,高度,这会更方便.无论如何,要定义区域以使图像居中,就是我们得到的代码.
它是这样的:左上角的x值等于大图像的宽度的一半减去蒙版图像的宽度的一半. (我发现笔和纸在这里很有用.)左上角的y值也是如此.那是前两个值.
现在,如果元组接受了(x,y,宽度,高度),则后两个值将只是蒙版图像的尺寸.但是他们不是,他们有更多的x和y职位.因此,我们必须手动计算它们,方法是使用与前两个值相同的代码(左上角的位置),并向其中添加图像的宽度和高度,这是我们从某些变量(img2_w和img2_h)中知道的.因此,元组的后两个值与第一个和第二个相同,但是增加了遮罩(img2)的宽度或高度.
好吧,我希望这很有意义,并且祝您项目顺利!