设计和实现24位位图图片色彩翻转成互补色程序。

本文围绕设计和实现24位位图图片色彩翻转成互补色程序展开。先介绍解题思路,包括查找二进制文件操作方法、明确24位彩色图片格式、准备图片等,接着阐述编程实现步骤,如确认文件格式、读取像素信息、新建文件、处理像素值等,最后验证代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验题目:设计和实现24位位图图片色彩翻转成互补色程序。

(提示:24位位图文件中的数据部分定义了每上像素像素单元,每个像素由三个字节组成,分别表示红、绿、蓝(r,g,b)三个分量,假设设这三量分别是x,y,z,那么255-x,255-y,255-z就是它的互补色。)

解题思路与算法设计:

1、看书查找二进制文件的操作方法,包括:打开二进制文件,读或写二进制文件的方法。

2、查找网络资源,找出24彩色图片的格式(注意:彩色图片文件有多种,比如:16位彩色文件,32位彩色文件等等,不要搞错了!24位位图文件分三部分:文件信息头、图像信息头和图像像素数据),我们要搞清楚文件信息头的长度和每个字节的含义,图像信息头的长度和每个字节的含义和像素数据的格式。

3、准备图片,注意不要搞错了,如果找不到24位位图(.bmp)文件,可以用系统自带pant打开一个别的图片,再另存为24位位图文件。

4、编程实现:

(1)打开位图文件(原文件)读取文件信息头的关键信息以确认这个文件是24位位图文件。

(2)读取文件的像素信息头的关键信息,比如:确定像素的有多少行,一行有多少像素等信息。

(3)新建一个位图文件,扩展名是.bmp(目标文件),把原图像文件的信息头的信息全部拷贝过去。

(4)将原文件指针移动到像素数据起始处,循环读取每个像素的r,g,b值。再把255-r,

255-g,255-b的值写到目标文件中。值到处理完有像素为止。关闭所有文件。

(5)打开目标文件查看翻转后的图片,验证你的代码。

from struct import *


class rmb:
    def __init__(self):
        file = open('messi.bmp', 'rb')

        self.bfType = file.read(2)
        self.bfSize = file.read(4)
        self.bfReserved1 = file.read(2)
        self.bfReserved2 = file.read(2)
        self.bfOffBits = file.read(4)

        self.biSize = file.read(4)
        self.biWidth = file.read(4)
        self.biHeight = file.read(4)
        self.biPlanes = file.read(2)
        self.biBitCount = file.read(2)

        self.biCompression = file.read(4)
        self.biSizeImage = file.read(4)
        self.biXPelsPerMeter = file.read(4)
        self.biYPelsPerMeter = file.read(4)
        self.biClrUsed = file.read(4)
        self.biClrImportant = file.read(4)
        self.bmp_data = []

        self.h, = unpack("<i", self.biHeight)
        self.w, = unpack("<i", self.biWidth)
        print(self.h)
        print(self.w)

        for height in range(self.h):
            bmp_data_row = []
            count = 0
            for width in range(self.w):
                bmp_data_row.append(
                    [unpack("<B", file.read(1))[0], unpack("<B", file.read(1))[0], unpack("<B", file.read(1))[0]])
                count += 3

            while count % 4 != 0:
                file.read(1)
                count += 1
            self.bmp_data.append(bmp_data_row)
        # self.bmp_data.reverse()
        file.close()

    def write_(self):
        res_file = open('res.bmp', 'wb')

        res_file.write(self.bfType)
        res_file.write(self.bfSize)
        res_file.write(self.bfReserved1)
        res_file.write(self.bfReserved2)
        res_file.write(self.bfOffBits)

        res_file.write(self.biSize)
        res_file.write(self.biWidth)
        res_file.write(self.biHeight)
        res_file.write(self.biPlanes)
        res_file.write(self.biBitCount)

        res_file.write(self.biCompression)
        res_file.write(self.biSizeImage)
        res_file.write(self.biXPelsPerMeter)
        res_file.write(self.biYPelsPerMeter)
        res_file.write(self.biClrUsed)
        res_file.write(self.biClrImportant)

        # res_file.write(bytes(self.img))

        for height in range(self.h):
            bmp_data_row = self.bmp_data[height]
            count = 0
            for width in range(self.w):
                res_file.write(pack("<B", 255 - bmp_data_row[width][0]))
                res_file.write(pack("<B", 255 - bmp_data_row[width][1]))
                res_file.write(pack("<B", 255 - bmp_data_row[width][2]))
                count += 3

            while count % 4 != 0:
                res_file.write(pack("<B", 0))
                count += 1


res = rmb
res.__init__(self=res)
res.write_(self=res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值