【发布时间】:2017-04-15 09:46:20
【问题描述】:
我正在尝试使用 python 将 BMP 图像转换为灰度图像。这是正确的问题。
编写一个程序来编辑一个图像文件,把它变成灰度。 将每个像素替换为具有相同灰度级的像素 蓝色、绿色和红色分量。灰度级由下式计算 添加 30% 的红色电平,59% 的绿色电平,以及 蓝色水平的 11%。 (色觉视锥细胞 人眼对红光、绿光和蓝光的敏感度不同。)
我已经进行了一些编码,但它实际上并没有变成灰度,而是或多或少地变成了奇怪颜色的混合物。有人可以更正我的代码并看看我做错了什么吗?这是我的代码
from io import SEEK_CUR
def main():
filename = input("Please enter the file name: ")
# Open as a binary file for reading and writing
imgFile = open(filename, "rb+")
# Extract the image information.
fileSize = readInt(imgFile, 2)
start = readInt(imgFile, 10)
width = readInt(imgFile, 18)
height = readInt(imgFile, 22)
# Scan lines must occupy multiples of four bytes.
scanlineSize = width * 3
if scanlineSize % 4 == 0:
padding = 0
else :
padding = 4 - scanlineSize % 4
# Make sure this is a valid image.
if fileSize != (start + (scanlineSize + padding) * height):
exit("Not a 24-bit true color image file.")
# Move to the first pixel in the image.
imgFile.seek(start)# Process the individual pixels.
for row in range(height): #For each scan line
for col in range(width): #For each pixel in the line
processPixel(imgFile)
# Skip the padding at the end.
imgFile.seek(padding, SEEK_CUR)
imgFile.close()## Processes an individual pixel.#@param imgFile the binary file containing the BMP image#
def processPixel(imgFile): #Read the pixel as individual bytes.
theBytes = imgFile.read(3)
blue = theBytes[0]
green = theBytes[1]
red = theBytes[2]
# Process the pixel.
newBlue = 255 - blue
newGreen = 255 - green
newRed = 255 - red
# Write the pixel.
imgFile.seek(-3, SEEK_CUR)# Go back 3 bytes to the start of the pixel.
imgFile.write(bytes([newBlue, newGreen, newRed]))## Gets an integer from a binary file.#@param imgFile the file#@ param offset the offset at which to read the integer#@
def readInt(imgFile, offset): #Move the file pointer to the given byte within the file.
imgFile.seek(offset)
# Read the 4 individual bytes and build an integer.
theBytes = imgFile.read(4)
result = 0
base = 1
for i in range(4):
result = result + theBytes[i] * base
base = base * 256
return result# Start the program.
main()
【问题讨论】:
标签: python python-3.x