灰度图像不是JPEG格式。

3
我创建了一张像这样的灰度图像。
def create_new_image(size, luminance):
    width, height = size
    black_frame = int(luminance) * np.ones((width, height, 1), dtype=np.uint8)
    return black_frame

亮度值luminance属于[0,255]的元素集

我使用imageio保存了图片

def save_image(image, output_path):
    imageio.imwrite(output_path, image)

这里的output_path类似于/valid_path/img.jpg

现在我想要加载我的灰度图像:

img = imageio.imread(file, format ='jpg')

但是我收到的却是一个语法错误。
raise SyntaxError("not a JPEG file")
  File "<string>", line None
SyntaxError: not a JPEG file

如果我不指定格式,就会出现另一个错误。

    "Could not find a format to read the specified file in %s mode" % modename
ValueError: Could not find a format to read the specified file in single-image mode

为什么?谢谢。

请提供能够重现问题的完整脚本(包括Python版本和所使用的库版本)。 - Leos313
@Jürgen K. 你能展示一下 output_path 的确切值吗? - DarK_FirefoX
@DarK_FirefoX,output_path只是您计算机中某个地方的路径。例如:output_path = '/home/DarKFirefox/Document/your/path/'。它只是一个字符串。 - Leos313
@Leos313,我知道应该是这样的。我只是想确认一下,因为他遇到的问题可能是由于图像文件路径错误导致的。因为如下答案所述:即使没有指定format=jpg,它对我来说也可以正常工作。 imageio文档说明它将根据文件(可能是文件扩展名)选择正确的解码器/编码器。所以@Jürgen K,我鼓励您打印(output_path)并检查它是否是文件的正确路径。 - DarK_FirefoX
@DarK_FirefoX,好观点!没错! - Leos313
4个回答

3

你可以尝试以下方法:

def save_image(image, output_path):
    imageio.imwrite(output_path, format= "jpg", image)

明确指出它是一个jpg文件。


1
JPEG文件(压缩图像)以始于图像标记的形式开始,该标记始终包含标记代码十六进制值FF D8 FF。它没有嵌入文件长度,因此我们需要找到JPEG尾部,即FF D9。
请查看使用此页面中的链接的文档。
例如,使用十六进制查看器(例如Hex Viewer)打开jpeg图像,您应该看到类似于以下内容的东西:

enter image description here

解决方案: 换句话说,在将文件保存为JPEG之前尝试向文件添加标题,您应该可以解决问题。

API文档页面可以在这里找到。根据文档,您应该找到正确的指令,让您指定保存格式(由@Meto在答案中指出)。

总之:解决方案就是在物理写入硬盘上的图像时指定格式:

imageio.imwrite(uri, im, format=None, **kwargs)

在您的情况下,format=jpg
此外,
 imageio.show_formats()

展示一个格式清晰的可用格式列表。
总之,尝试替换


imageio.imwrite(output_path, image)

使用

imageio.imwrite(output_path, image, format ='jpg' )

请注意,每个答案的解决方案始终相同。我只是添加了指定格式的内容说明(即,只写正确的标题)。

好的,你能提供用于创建图像的代码吗?插入整个脚本,这样我就可以尝试查看整个程序。 - Leos313

0

您需要确保您的文件确实保存为JPG文件。 在Linux/Mac上,您可以使用file命令进行验证。

例如,下面的命令确认fireside.jpg是一个JPEG文件:

# file fireside.jpg
fireside.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 2048x1365, components 3

如果文件没有保存为JPG格式,请尝试指定文件格式="jpg"。
imageio.imwrite(output_path, image, format ='jpg')

-1

这个可行(在Jupyter笔记本中验证过)

import numpy as np
import imageio

def create_new_image(size, luminance):
    width, height = size
    black_frame = int(luminance) * np.ones((width, height, 1), dtype=np.uint8)
    return black_frame

def save_image(image, output_path):
    imageio.imwrite(output_path, image)

img = create_new_image((256, 256), 125)
save_image(img, "test.jpg")
img1 = imageio.imread("test.jpg", format ='jpg')

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