打开进程并将特定图像保存在相关文件夹中

Posted

技术标签:

【中文标题】打开进程并将特定图像保存在相关文件夹中【英文标题】:Open process and save specific images in related folder 【发布时间】:2015-08-30 23:51:02 【问题描述】:

我正在寻找一种方法来打开和裁剪多个 tiff 图像,然后保存在同一文件夹中创建的新裁剪图像(与我的脚本文件夹相关)。

我当前的代码如下所示:

from PIL import Image
import os,platform

filespath = os.path.join(os.environ['USERPROFILE'],"Desktop\Python\originalImagesfolder")

for file in os.listdir(filespath):
    if file.endswith(".tif"):
        im = Image.open(file)
        im.crop((3000, 6600, 3700, 6750)).save(file+"_crop.tif")

此脚本返回错误:

Traceback(最近一次调用最后一次):

文件“C:\Users...\Desktop\Python\script.py”,第 22 行,在 im = Image.open(文件) 文件“C:\Python34\lib\site-packages\PIL\Image.py”,第 2219 行,打开 fp = builtins.open(fp, "rb") FileNotFoundError:[Errno 2] 没有这样的文件或目录:'Image1Name.tif'

'Image1Name.tif' 是我尝试在文件夹中处理的第一个 tif 图像。我不明白脚本如何在找不到文件的情况下给出文件名。有什么帮助吗?

PS:一般来说,我有 2 天的 Python 和代码经验。对不起,如果答案很明显

[编辑/更新] 感谢 vttran 和 ChrisGuest 的回答修改了我的初始代码后,变成了这样:

from PIL import Image
import os,platform

filespath = os.path.join(os.environ['USERPROFILE'],"Desktop\Python\originalImagesfolder")

for file in os.listdir(filespath):
    if file.endswith(".tif"):
        filepath = os.path.join(filespath, file)
        im = Image.open(filepath)
        im.crop((3000, 6600, 3700, 6750)).save("crop"+file)

脚本正在向我返回一条新的错误消息:

回溯(最近一次通话最后一次): 文件“C:/Users/.../Desktop/Python/script.py”,第 11 行,在 im.crop((3000, 6600, 3700, 6750)).save("crop"+file) 文件“C:\Python34\lib\site-packages\PIL\Image.py”,第 986 行,裁剪中 self.load() 文件“C:\Python34\lib\site-packages\PIL\ImageFile.py”,第 166 行,加载中 self.load_prepare() 文件“C:\Python34\lib\site-packages\PIL\ImageFile.py”,第 250 行,在 加载准备 self.im = Image.core.new(self.mode, self.size) ValueError: unrecognized mode

可能有用的信息,它是 GeoTiff 格式的 Landsat8 图像。因此,TIFF 文件包括地理位置、投影...信息。如果我首先使用 Photoshop(16int tiff 格式)之类的软件打开并重新保存脚本,脚本就可以正常工作。

【问题讨论】:

FileNotFoundError 由 Image.py 引发。该文件由os.listdir 调用找到。但是你在那里提供filespath。您需要将 filespath 附加到 Image.open() 调用中,就像 im = Image.open(os.path.join(filespath,file)) 感谢您的回答。脚本现在向我返回错误:文件“C:\Python34\lib\site-packages\PIL\Image.py”,第 2215 行,在 open raise ValueError("bad mode %r" % mode) ValueError: bad mode 'Image1.TIF'。这看起来与文件的格式无关,因为在脚本文件夹中的同一图像上使用的相同功能可以正常工作... 不知何故您将“Image1.TIF”作为模式参数传递。您自己代码中的哪一行导致此异常?请使用您的新代码和完整的回溯更新您的帖子。 【参考方案1】:

当您搜索文件名时,您使用 filespath 指定目录。

但是当您打开文件时,您只使用基本文件名。

所以你可以替换

im = Image.open(file)

filepath = os.path.join(filespath, file)
im = Image.open(filepath)

还可以考虑使用 glob 模块,就像您可以使用 glob.glob(r'path\*.tif) 一样。 避免使用像file 这样的内置函数作为变量名也是一个好习惯。

【讨论】:

感谢您的回答。我必须添加“路径”才能使其正常工作:'os.path.join'。 道歉。你是对的。我已经在我的解决方案中解决了这个问题。 如果该答案适合您,请点击旁边的箭头接受。

以上是关于打开进程并将特定图像保存在相关文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

如何打开 CSV 文件并将特定值加一

如何打开目录中的所有文件并将更改保存在同一文件中? [关闭]

将位图保存到位置

扫描图像并将其像 pdf 一样保存到数据库 c#

进程无法访问图像文件,因为它正被另一个进程使用

有没有办法从文件夹中读取图像并将其保存在 powerpoint 中