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")