一维数据转化成彩色RGB渐变数据

Language: Chinese

在这里插入图片描述

​ 写这一小段代码的起因是:一开始不太明白tecplot导入dat文件的要求,自己写的LBM代码生成的数据没法实现tecplot中的彩虹渐变色的云图,于是就想着能不能把0~1之间的数据转化成RGB,然后供我生成彩色的渐变云图。(后来明白tecplot导入dat文件的要求了,所以这一小段代码我可能以后也不会进一步改进了)

​ 0~1的一维格子数值转化为三维RGB值的参考源自:无聊向 —— RGB彩虹色渐变算法 - 网中的小鱼 - 博客园 (cnblogs.com)

​ 和原本佬的不同的是,在云图中为了避免紫色与红色颜色接近导致云图模糊难以分辨,这里设置了RGB彩虹色的上界为蓝色。

from PIL import Image

def float_to_rgb(data_list, isabs=1, l=101, w=101):
    """
    将传入的列表转化为RGB值用于可视化
    :return: data_rgb(list)
    """
    if isabs == 1:
        data_list_min = min(data_list)
        # 原有列表数据copy一份,将其全部向正向移动,使其全部为非负值
        data_copy = []
        for i in data_list:
            data_copy.append(i + abs(data_list_min))

        data_rgb = []
        color_up = 5  # 颜色阈值的上界线,避免紫色与红色模糊不清
        data_copy_max = max(data_copy)

        for i in range(len(data_copy)):
            data_copy[i] = data_copy_max - data_copy[i]  # 将颜色反转
            data_rgb.append([])

            # 分别输入RGB值
            match ((data_copy[i] * color_up) // (data_copy_max - data_list_min)):
                case 0:
                    data_rgb[i].append(255)
                    data_rgb[i].append(int(152.0 * (data_copy[i] / (data_copy_max / color_up))))
                    data_rgb[i].append(0)
                case 1:
                    data_rgb[i].append(255)
                    data_rgb[i].append(int((103.0 * (data_copy[i] / (data_copy_max / color_up)) + 50)))
                    data_rgb[i].append(0)
                case 2:
                    data_rgb[i].append(int(((-255.0) * (data_copy[i] / (data_copy_max / color_up))) + 765))
                    data_rgb[i].append(255)
                    data_rgb[i].append(0)
                case 3:
                    data_rgb[i].append(0)
                    data_rgb[i].append(255)
                    data_rgb[i].append(int((255.0 * (data_copy[i] / (data_copy_max / color_up))) - 765))
                case 4:
                    data_rgb[i].append(0)
                    data_rgb[i].append(int(((-255.0) * (data_copy[i] / (data_copy_max / color_up))) + 1275))
                    data_rgb[i].append(255)
                case 5:
                    data_rgb[i].append(int((150.0 * (data_copy[i] / (data_copy_max / color_up))) - 750))
                    data_rgb[i].append(0)
                    data_rgb[i].append(255)
        # rgb_max = max(map(max, data_rgb))
        # rgb_min = min(map(min, data_rgb))
        # print(rgb_min, rgb_max)

    elif isabs != 1:
        pass

    return data_rgb


# 打开txt文件
with open('Users_data/data.dat', 'r') as file:
    # 跳过前三行,根据自己导出的文件来
    for _ in range(3):
        next(file)

    # 逐行读取数据并放入二维列表
    data = []
    for line in file:
        # 去除行尾的换行符,并按空格分割数据
        row = line.strip().split()
        # 将数据转换为数字类型,并添加到二维列表中
        data.append([float(num) for num in row])

data_l1 = [i[0] for i in data]
data_l2 = [i[1] for i in data]
data_l3 = [i[2] for i in data]

# 检查数据是否正常(因为我用的LBM)
# max_data_l3 = max(data_l3)
# print(max_data_l3)

# 下面注释的生成一个颜色的灰度图
# # 创建一个100x100像素的图像,使用RGB模式
# image = Image.new("RGB", (101, 101))
#
# # 获取图像的像素访问对象
# pixels = image.load()
#
# # 按照像素绘制图片
# for i in range(101):
#     # print(i)
#     for j in range(101):
#         pixels[j, i] = (int(200 * (abs(data_l3[i * 101 + j]))), 10, 0)
#
# # 输出并保存图片
# image.save("output_D2Q9_扩散.png")

"""
绘制一个彩色的图像
"""

# 需要绘制哪一列函数第一个参数就传入该列表,第二个参数一开始是为了选择绘制的图的色条格式的,目前懒得加功能了
color1 = float_to_rgb(data_l3, 1)

# 创建一个101x101像素的图像,使用RGB模式
image_color = Image.new("RGB", (101, 101))

# 获取图像的像素访问对象
pixels2 = image_color.load()

# 按照像素绘制图片
for i in range(101):
    for j in range(101):
        pixels2[j, 100 - i] = (color1[i * 101 + j][0], color1[i * 101 + j][1], color1[i * 101 + j][2])

# 输出并保存图片
image_color.save("output_D2Q9_扩散.png")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值