我正在尝试制作一个与RGB像素数据相关的库,但似乎无法正确保存图像数据。
这是我的输出图像。 这是我的代码:
像素管理器.py
from PIL import Image
import numpy as np
class MakeImgFromPixelRGB:
def createIMG(PixelArray: list, ImgName: str, SaveImgAsFile: bool):
# Convert the pixels into an array using numpy
array = np.array(PixelArray, dtype=np.uint8)
if SaveImgAsFile == True:
new_image = Image.fromarray(array)
new_image.save(ImgName)
class getPixelsFromIMG:
def __init__(self, ImagePath):
im = Image.open(ImagePath, 'r')
width, height = im.size
pixel_values = list(im.getdata())
self.output = pixel_values
测试.py
import pixelmanager
a = pixelmanager.getPixelsFromIMG(ImagePath="download.jpg")
pixelmanager.MakeImgFromPixelRGB.createIMG(a.output, "output.png", True)
with open("output.txt", "w") as f:
for s in a.output:
f.write(str(s) + "," + "\n")
我尝试过在paint.net中对图像进行缩放,也尝试过改变uint大小。
将图像视为 Python 像素列表通常不是最好的主意,因为它很慢并且容易出错。一般来说,您希望使用以
C
编码并处理 PIL Image
类型的 PIL 函数,或者高度矢量化/优化并处理 Numpy 数组的 Numpy 或 OpenCV。
无论如何,如果你真的非常想处理列表(其实你不想),你需要记住,当你针对 JPEG 调用
Image.getdata()
时,你将得到一个 flat RGB 元组列表。因此,如果您的图像是 640x480 像素,并且您执行以下操作:
im = Image.open('image.jpg')
px = list(im.getdata())
您将得到一个包含 307,200 个条目的列表,每个条目都是一个 RGB 元组。 但是您的列表不再知道图像的高度和宽度。因此,当您随后这样做时:
array = np.array(PixelArray, dtype=np.uint8)
你的数组现在的形状是 (307200,3) 而不是 (480,640,3) - 太棒了,你在输出图像中得到了一长串像素。
如果您坚持使用列表,则需要保留原始图像的高度和宽度,因此您可以这样做:
array = np.array(PixelArray, dtype=np.uint8).reshape(h,w,3)