纹理和图像

DPG使用图形处理单元(GPU)来创建您所看到的图形用户界面(GUI)。要显示图像,必须首先使用图像数据创建纹理,然后可以将该纹理上载到GPU。这些纹理属于纹理注册表。

我们提供三种质地

  • 静电

  • 动态

  • 生品

然后在以下应用程序项目中使用此纹理

  • mvDrawImage

  • mvImage

  • mvImageButton

  • mvImageSeries

它们始终是一维列表或数组。

在纹理注册表上使用关键字Show将打开纹理注册表。

静态纹理

静态纹理用于不经常更改的图像。它们通常在启动时加载。如果需要更新它们,您可以删除并重新创建它们。它们接受Python列表、元组、NumPy数组,以及支持具有连续数据的Python缓冲区协议的任何类型。下面是一个简单的例子

import dearpygui.dearpygui as dpg

dpg.create_context()

texture_data = []
for i in range(0, 100 * 100):
    texture_data.append(255 / 255)
    texture_data.append(0)
    texture_data.append(255 / 255)
    texture_data.append(255 / 255)

with dpg.texture_registry(show=True):
    dpg.add_static_texture(width=100, height=100, default_value=texture_data, tag="texture_tag")

with dpg.window(label="Tutorial"):
    dpg.add_image("texture_tag")


dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

可以使用以下命令删除纹理 dpg.delete_item("texture_tag") 。但是,对于要发布的标记/别名,使用 "texture_tag" (如剧情系列)也必须删除。

动态纹理

动态纹理用于每帧可以更改的中小型纹理。可以使用以下命令更新这些选项 set_value 但宽度和高度必须与第一次创建纹理时相同。除了执行安全检查和转化外,这些纹理与原始纹理相似。下面是一个简单的例子

import dearpygui.dearpygui as dpg

dpg.create_context()

texture_data = []
for i in range(0, 100 * 100):
    texture_data.append(255 / 255)
    texture_data.append(0)
    texture_data.append(255 / 255)
    texture_data.append(255 / 255)

with dpg.texture_registry(show=True):
    dpg.add_dynamic_texture(width=100, height=100, default_value=texture_data, tag="texture_tag")


def _update_dynamic_textures(sender, app_data, user_data):
    new_color = dpg.get_value(sender)
    new_color[0] = new_color[0] / 255
    new_color[1] = new_color[1] / 255
    new_color[2] = new_color[2] / 255
    new_color[3] = new_color[3] / 255

    new_texture_data = []
    for i in range(0, 100 * 100):
        new_texture_data.append(new_color[0])
        new_texture_data.append(new_color[1])
        new_texture_data.append(new_color[2])
        new_texture_data.append(new_color[3])

    dpg.set_value("texture_tag", new_texture_data)


with dpg.window(label="Tutorial"):
    dpg.add_image("texture_tag")
    dpg.add_color_picker((255, 0, 255, 255), label="Texture",
                         no_side_preview=True, alpha_bar=True, width=200,
                         callback=_update_dynamic_textures)


dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

原始纹理

原始纹理的使用方式与动态纹理相同。主要区别是

  • 只接受数组(NumPy、PYTHON等)

  • 不执行任何安全检查。

这些纹理用于需要每帧更新大型纹理的高性能应用程序。下面是一个简单的例子

import dearpygui.dearpygui as dpg
import array

dpg.create_context()


texture_data = []
for i in range(0, 100 * 100):
    texture_data.append(255 / 255)
    texture_data.append(0)
    texture_data.append(255 / 255)
    texture_data.append(255 / 255)

raw_data = array.array('f', texture_data)

with dpg.texture_registry(show=True):
    dpg.add_raw_texture(width=100, height=100, default_value=raw_data, format=dpg.mvFormat_Float_rgba, tag="texture_tag")


def update_dynamic_texture(sender, app_data, user_data):
    new_color = dpg.get_value(sender)
    new_color[0] = new_color[0] / 255
    new_color[1] = new_color[1] / 255
    new_color[2] = new_color[2] / 255
    new_color[3] = new_color[3] / 255

    for i in range(0, 100 * 100 * 4):
        raw_data[i] = new_color[i % 4]


with dpg.window(label="Tutorial"):
    dpg.add_image("texture_tag")
    dpg.add_color_picker((255, 0, 255, 255), label="Texture",
                         no_side_preview=True, alpha_bar=True, width=200,
                         callback=update_dynamic_texture)


dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

格式

目前支持以下格式

格式化

静态纹理

动态纹理

原始纹理

mvFormat_Float_rgba

mvFormat_Float_rgb

✅*

mvFormat_Int_rgba

mvFormat_Int_rgb

备注

mvFormat_Float_rgb MacOS目前不支持
未来还会增加更多的格式。

正在加载图像

DPG提供了该功能 load_image 用于从文件加载图像数据。

此函数返回一个元组,其中

  • 0->宽度

  • 1->高度

  • 2->渠道

  • 3->DATA(一维数组,mvBuffer)

如果失败,则返回 None

接受的文件类型包括:

  • JPEG(无12位/通道JPEG或采用算术编码的JPEG)

  • PNG

  • BMP

  • PSD

  • GIF

  • HDR

  • PIC

  • PPM

  • PGM

下面是一个简单的例子

import dearpygui.dearpygui as dpg

dpg.create_context()

width, height, channels, data = dpg.load_image("Somefile.png")

with dpg.texture_registry(show=True):
    dpg.add_static_texture(width=width, height=height, default_value=data, tag="texture_tag")

with dpg.window(label="Tutorial"):
    dpg.add_image("texture_tag")


dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

保存图像

1.4中的新功能 。DPG提供了该功能 save_image 用于将图像数据保存到文件。

该图像是从左到右、从上到下存储的像素的矩形。每个像素最多包含4个数据分量,每个通道8位交织,顺序如下:1=Y、2=YA、3=RGB、4=RGBA。(y表示单色。)

PNG创建的输出文件具有与输入相同数量的组件。BMP格式将文件格式中的Y扩展为RGB,并且不输出Alpha。

其他选项将在1.4.1版中发布。

接受的文件类型包括:

  • PNG

  • JPG(v1.4.1中的新功能)

  • BMP(v1.4.1中的新功能)

  • TGA(v1.4.1中的新功能)

  • HDR(v1.4.1中的新功能)

文件类型由扩展名决定。必须为小写(PNG、JPG、BMP、TGA、HDR)。

下面是一个简单的例子

import dearpygui.dearpygui as dpg

dpg.create_context()
dpg.create_viewport()
dpg.setup_dearpygui()

width, height = 255, 255

data = []
for i in range(width*height):
    data.append(255)
    data.append(255)
    data.append(0)

with dpg.window(label="Tutorial"):
    dpg.add_button(label="Save Image", callback=lambda:dpg.save_image(file="newImage.png", width=width, height=height, data=data, components=3))

dpg.show_viewport()
while dpg.is_dearpygui_running():
    dpg.render_dearpygui_frame()

dpg.destroy_context()