【问题标题】:How to change the value of each pixel in an image in python?如何在python中更改图像中每个像素的值?
【发布时间】:2021-02-12 20:41:09
【问题描述】:

为了对图像进行过滤,软件会改变图像中像素的值。

当我尝试这段代码时

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: 窗户10,python3.8。 我试图简化一切。

不起作用我的意思是没有错误,但操作系统无法解码并输出图像 我不想使用像 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()

【问题讨论】:

  • JPEG 不能这样工作。 JPEG图像中有很多复杂的压缩和编码。按原样存储的 RGB 值只会出现在位图图像中。您应该为此使用适当的库。没有理由不这样做。
  • 我也想知道为什么它只输出像素数据而不输出元数据等其他内容...
  • 我的回答或其他人是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…

标签: python python-3.x image file rgb


【解决方案1】:

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

如果您真的不想使用 Python 库,您可以在终端中使用 ImageMagick(命令行工具)来转换您的图像成纯 RGB 像素。因此,如果您的图像名为 input.jpg,您可以在终端中运行它:

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

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

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

注意您必须如何告诉 ImageMagick 从 RGB 字节到 JPEG 的回程图像的高度和宽度,因为文件开头没有标明其高度和宽度的标题.

【讨论】:

    【解决方案2】:

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

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

    这段代码复制了一张图片的二进制数据并成功创建了一个新的。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 2017-09-20
      • 2011-01-17
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多