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

How to change the value of each pixel in an image in 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 不起作用我的意思是没有错误但是 OS 无法解码并输出图像 我不想使用任何像 PIL 这样的第三方库。

此代码复制图像的二进制数据并成功制作新图像。

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

x = file.read() #reading from file

file.close() #closing file

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

file.close()

我知道它正在输出每个像素的信息,因为没有值高于 255 或低于 0

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

此代码复制图像的二进制数据并成功制作新图像。

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

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

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

JPEG, PNG 大多数图像文件格式都不是这样工作的。它们以 header 开头,其中包含元数据,例如您拍摄照片的日期、您的相机型号、您的 GPS 坐标、图像高度、宽度和版权信息。之后,它们通常以高度优化的压缩格式存储像素,因此您必须首先解压缩数据才能更改像素。然后您可以编辑它们并将它们写回,使用新的 headers 并重新压缩。所以你最好使用图书馆。

如果您真的非常不想使用 Python 库,您 可以 使用 ImageMagick(一个command-line 工具)将您的图像转换为纯 RGB 像素。因此,如果您的图片名为 input.jpg,您可以在终端中 运行 这样做:

magick input.jpg -depth 8 RGB:pixels.dat

然后,如果您的图像是 640x480 像素,则名为 pixels.dat 的文件将正好是 640x480x3 字节长,没有 header 或元数据或压缩。然后,您可以完全按照您最初设想的那样进行处理。之后,您可以通过以下方式将其恢复为 JPEG 或 PNG:

magick -depth 8 -size 640x480 RGB:pixels.dat output.jpg

注意你必须如何告诉 ImageMagick 从 RGB 字节到 JPEG return 旅程的图像的高度和宽度,因为没有 header 在文件的开头说明它的高度和宽度。