如何在python中更改图像中每个像素的值?

问题描述

为了制作图像过滤器,软件会更改图像中的像素值。

当我尝试此代码

file = open("hey.jpg","rb") #opening file

x = file.read() #reading from file

for i in range(len(x)): 
    print(x[i]) #cordinate of each pixel

file.close() #closing file

我知道它是通过输出输出每个像素的信息,因为没有值大于255或小于0。

我的图片输出示例:

240 -> R
255 -> G
0   -> B

我要更改每个值并将其保存在新图像中

我尝试了以下代码,但不起作用

file = open("hey.jpg","rb") #opening file

x = file.read() #reading from file

file.close() #closing file

file = open("new.jpg","wb") #the new image
 
for i in range(len(x)): #writing the new data with filter

    if x[i] !=255: #pixels RGB cant be 256
        file.write(bytes(x[i] + 1)) #bytes because when doig write(x[i]+1) it gives mes an error that a bytee object is required not int
    else: #if it is 255 then do nothing
        file.write(bytes(x[i]))

file.close()#closing the new image

无需阅读以下内容

PS: Windows 10,python3.8。 我试图简化一切。

by不起作用,我的意思是没有错误,但是操作系统无法对其进行解码并输出图像 我不想使用像PIL这样的任何第三方库。

代码复制图像的二进制数据并成功创建一个新图像。

file = open("hey.jpg","wb")
 
file.write(x)

file.close()

解决方法

我知道它正在通过输出来输出每个像素的信息,因为没有值大于或小于255或小于0

此行为的原因与“每个像素的信息”不同-您只访问了文件的单个字节,并且1个字节的值始终从0x00(包括)到0xFF(包括) )。如果对其他类型的文件(例如,文本一)执行此操作,结果将相似。

此代码复制图像的二进制数据并成功创建一个新图像。

您的代码只是将文件内容复制到另一个文件中。请注意,无论文件类型如何,它都可以工作。

我不想使用任何第三方库,例如PIL

随心所欲,但是请记住,没有“任何第三方库”,您必须从头开始实现每种图像格式的处理。

,

JPEGPNG和大多数图像文件格式不能那样工作。它们的开头带有标头,其中包含元数据,例如拍摄日期,相机型号,GPS坐标,图像高度,宽度和版权信息。此后,它们通常以经过高度优化的压缩格式存储像素,因此您必须先对数据进行解压缩才能更改像素。然后,您可以编辑它们并使用新的标头将它们写回并重新压缩。因此,建议您使用一个库。

如果您确实真的不想使用Python库,则可以可以在终端中使用 ImageMagick (命令行工具)来转换图像变成纯RGB像素。因此,如果您的图片名为 1.0 (x + 1) x + 1 ,则可以在Terminal中运行此图片:

input.jpg

然后,如果您的图像为640x480像素,则名为magick input.jpg -depth 8 RGB:pixels.dat 的文件将恰好为640x480x3字节长,没有标题,元数据或压缩。然后,您可以完全按照最初的设想进行处理。之后,您可以使用以下方法将其重新转换为JPEG或PNG:

pixels.dat

请注意,在从RGB字节返回JPEG的过程中,必须如何告知 ImageMagick 图像的高度和宽度,因为文件开头没有标头说明高度和宽度