【问题标题】:how to correctly duplicates pillow images [duplicate]如何正确复制枕头图像[重复]
【发布时间】:2020-06-26 04:18:01
【问题描述】:

当我想在 2 个不同的变量中使用相同的图像 2 次时,我可以修改一个,同时将另一个作为参考。我以前是这样的:

im1 = Image.open(imagepath)
im2 = im1

我在这样做时总是遇到问题,因为如果我修改一个图像,另一个图像也会被修改。如果您愿意,可以自己尝试:

from PIL import Image
im1 = Image.open(r"D:\python\pixelartor\pixelartor_v3.1\pkg\trezor\trezor_0007.png")
im1.show()
im2 = im1
for x in range(100):
    for y in range(100):
        im2.putpixel((x,y),(255,0,0))
im1.show()

正如您在上面的脚本中看到的,我显示 im1,然后我修改 im2 并再次显示 im1,但第一个 im1 和第二个不一样,但我从未要求枕头修改 im1:

我认为有一种非常聪明的方法可以复制 PIL.Images,但我在网上找不到任何东西。 并且请不要告诉我打开图像 2 次,因为它在我的情况下不起作用。 我希望有人能帮帮我,因为我两周前遇到了这个问题,所以我放弃了我的项目,本周我从头开始重新启动同一个项目,同样的问题发生了,但这一次,我试图了解发生了什么。

【问题讨论】:

  • im2 = im1 使它们是相同的图像。你甚至不必复制像素——检查一下,你会看到的。 im2 应该是一个新图像(具有相同的大小、颜色等)。
  • @usr2564301 但是如果我复制他的代码,两张图片就会改变。
  • @jizhihaoSAMA:这就是问题所在,是的。
  • 这能回答你的问题吗? Python Copy Through Assignment?
  • 这是 PIL 特有的或独有的部分吗?

标签: python python-imaging-library


【解决方案1】:

我试过你的代码,这是我的代码和结果:

from PIL import Image

im1 = Image.open("1.ico")
im2 = im1

print(im1)
print(im2)

for x in range(30):
    for y in range(30):
        im2.putpixel((x,y),(255,0,0))

im2.show()
im1.show()
print(im2 is im1)
# <PIL.IcoImagePlugin.IcoImageFile image mode=RGBA size=64x64 at 0x1AF1EB163C8>
# <PIL.IcoImagePlugin.IcoImageFile image mode=RGBA size=64x64 at 0x1AF1EB163C8>
# True

它们具有相同的地址,因此它们是相同的对象。 也许你可以使用deepcopy,像这样:

from PIL import Image
import copy
im1 = Image.open(r"2.png")
im2 = copy.deepcopy(im1)
print(im1)
print(im2)

for x in range(30):
    for y in range(30):
        im2.putpixel((x,y),(255,0,0))

im2.show()
im1.show()
print(im2 is im1)
# <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=255x255 at 0x211FEBE60B8>
# <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=255x255 at 0x211FFCF70F0>
# False

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多