问题描述
为了制作图像过滤器,软件会更改图像中的像素值。
当我尝试此代码时
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
随心所欲,但是请记住,没有“任何第三方库”,您必须从头开始实现每种图像格式的处理。
,JPEG,PNG和大多数图像文件格式不能那样工作。它们的开头带有标头,其中包含元数据,例如拍摄日期,相机型号,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 图像的高度和宽度,因为文件开头没有标头说明高度和宽度