使用Python将目录中的所有文件(.jpg转为.png格式)

7

我想把一个文件夹中的所有文件从 .jpg 格式转换为 .png 格式。文件名应该保持不变,只是格式会改变。

我做了一些调查,得到了以下方法:

from PIL import Image
import os

directory = r'D:\PATH'

for filename in os.listdir(directory):
    if filename.endswith(".jpg"):
        im = Image.open(filename)
        im.save('img11.png')
        print(os.path.join(directory, filename))
        continue
    else:
        continue

我原本希望循环所有我的.jpg文件并将它们转换为.png文件。到目前为止,我只用了一个名字:'img11.png',我还没有成功构建出能够编写适当名称的东西。 print(os.path.join(directory, filename))起作用,它打印出了所有的文件,但在转换部分方面,它只对一个文件有效。
你们有什么想法可以帮助我完成这个过程吗?

将扩展名从.jpg更改为.png对您来说是一个好的转换吗? - Wonka
请阅读此内容:https://www.quora.com/What-happens-when-you-rename-a-jpg-to-a-png-file - Wonka
但是他没有重命名文件,@Wonka Image package 将会转换为另一种格式。所以不确定是谁给了那个"-1"。 - Marek Maszay
@Wonka 这是一个机器学习项目,我需要训练一个算法来处理 .jpg / .png / .pdf 文件。由于我有大量的 .jpg 文件,所以我需要将数据集分割,以便获得均匀分布的数据集。 - Grégoire de Kermel
2
我不是Python专家,但由于您将每个文件都保存为相同的名称,它不会每次都遍历所有文件并覆盖它吗?尝试在末尾使用索引进行保存以避免此问题。 - relief.melone
4个回答

8
您可以将打开的图像转换为RGB格式,然后以任何格式保存。您可以尝试以下代码:
from PIL import Image
import os

directory = r'D:\PATH'
c=1
for filename in os.listdir(directory):
    if filename.endswith(".jpg"):
        im = Image.open(filename)
        name='img'+str(c)+'.png'
        rgb_im = im.convert('RGB')
        rgb_im.save(name)
        c+=1
        print(os.path.join(directory, filename))
        continue
    else:
        continue

2
我会使用os.rename()函数,如下所示:“最初的回答”。
import os 
directory = r'D:\PATH' 
for filename in os.listdir(directory):
    prefix = filename.split(".jpg")[0]
    os.rename(filename, prefix+".png")

请告诉我这是否符合您的要求。在应用到目标文件夹之前,请在测试文件夹中尝试使用一些复制的图像来测试代码。祝一切顺利。

原始答案: "最初的回答"


谢谢@Amit,它可以将文件转换为.png格式。但奇怪的是,它无法将文件转换为.pdf格式。它显示文件类型不受支持或已损坏。你知道为什么吗? - Grégoire de Kermel
抱歉,我误解了您的请求,以为是重命名而不是转换。我同时在做两件事情。非常抱歉。我的先前代码只会重命名。可用性很可能被破坏,因为只更改了扩展名。我现在会发布另一个答案。它基本上只是对您的程序进行了非常小的编辑。再次道歉。 - Amit
@Grégoire de Kermel。既然您已经接受了我的解决方案,我想请求您查看我的最后一篇帖子(在页面底部)。如果您无法取消选择我的答案并在此页面中选择更好的答案,请让我知道(如果页面底部的答案有效)。如果是这样,我将交换两个答案。否则,未来有人看到这篇帖子(如果匆忙),可能会使用错误的解决方案并遭受损失。请帮助我纠正这篇帖子,否则请选择其他答案作为解决方案。目的不是为了显得聪明,而是防止未来有人走错方向。谢谢。 - Amit

2
from PIL import Image 
import os 
directory = r'D:\PATH' 
for filename in os.listdir(directory): 
    if filename.endswith(".jpg"): 
        prefix = filename.split(".jpg")[0]
        im = Image.open(filename)
        im.save(prefix+'.png')  
    else: 
        continue

请尝试这个并告诉我。最初的回答。

从PIL库导入Image模块 导入os模块 directory = r'D:\PATH' - ahmad iqbal

2
你将每个文件都显式地保存为,你应该获取你的文件名,然后使用它来命名和保存文件。最初的回答。
name = filename[:-4]
im.save(name + '.png')

它完美地工作,无论是转换为.png还是.pdf格式。感谢@Arienrhod。 - Grégoire de Kermel
虽然可以运行,但从长远来看并不是一个好的解决方案。在这里我们假设文件的扩展名只有3个字符(长度),这可能不是真实情况(例如.jpeg.tiff等)。因此,我建议您使用类似于os.path.splittext()[0]的方法来获取真实的文件名,而不考虑扩展名的长度。 - Vasu Deo.S
或者最后一个点号分割的 [1] 也可以。 - 임세준

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接