头文件代码:

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PixelReaderLibrary.generated.h"

UCLASS()
class MYPROJECT_API UPixelReaderLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable, Category = "PixelReader")
	static void ReadPixelsFromTexture(UTexture2D* Texture, TArray<uint8>& Pixels);
};

cpp代码:

#include "PixelReaderLibrary.h"
#include "Engine/Texture2D.h"

void UPixelReaderLibrary::ReadPixelsFromTexture(UTexture2D* Texture, TArray<uint8>& Pixels)
{
	if (!Texture)
	{
		return;
	}

	FTexture2DMipMap& Mip = Texture->PlatformData->Mips[0];
	const uint8* DataPtr = (const uint8*)Mip.BulkData.LockReadOnly();
	const int32 Width = Mip.SizeX;
	const int32 Height = Mip.SizeY;

	Pixels.Empty();
	Pixels.Reserve(Width * Height);

	for (int32 y = 0; y < Height; ++y)
	{
		for (int32 x = 0; x < Width; ++x)
		{
			const uint8* PixelPtr = DataPtr + (x + y * Width) * sizeof(FColor);
			FColor PixelColor = *(FColor*)PixelPtr;
			uint8 GrayScale = (PixelColor.R + PixelColor.G + PixelColor.B) / 3;
			Pixels.Add(GrayScale);
		}
	}

	Mip.BulkData.Unlock();
}

使用方法:

  1. 将上述头文件代码和cpp代码分别保存为PixelReaderLibrary.h和PixelReaderLibrary.cpp,并将它们放在项目的Source文件夹下的任意子文件夹中。
  2. 在UE5编辑器中创建一个蓝图Actor,打开蓝图编辑器。
  3. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为Texture2D的变量,并将其命名为“InputTexture”。
  4. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为Int32的变量,并将其命名为“Width”。
  5. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为Int32的变量,并将其命名为“Height”。
  6. 在蓝图编辑器中,右键单击空白处,选择“Add Component”,选择“Sphere”或其他任意类型的组件。
  7. 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“ReadPixels”。
  8. 在蓝图编辑器中,将InputTexture拖拽到蓝图编辑器中,连接到ReadPixels节点的输入端口上。
  9. 在蓝图编辑器中,将Width和Height拖拽到蓝图编辑器中,连接到ReadPixels节点的输出端口上。
  10. 在蓝图编辑器中,右键单击空白处,选择“Add Function”,将其命名为“GetPixels”。
  11. 在蓝图编辑器中,打开GetPixels函数,将以下代码复制粘贴到函数中:
UPixelReaderLibrary::ReadPixelsFromTexture(InputTexture, Pixels);
Width = InputTexture->GetSizeX();
Height = InputTexture->GetSizeY();
  1. 在蓝图编辑器中,将GetPixels函数拖拽到蓝图编辑器中,连接到ReadPixels节点的输出端口上。
  2. 在蓝图编辑器中,右键单击空白处,选择“Add New Variable”,创建一个类型为Byte的数组,并将其命名为“Pixels”。
  3. 在蓝图编辑器中,将Pixels拖拽到蓝图编辑器中,连接到GetPixels节点的输入端口上。
  4. 在蓝图编辑器中,右键单击空白处,选择“Add Custom Event”,将其命名为“PrintPixels”。
  5. 在蓝图编辑器中,将Pixels拖拽到蓝图编辑器中,连接到PrintPixels节点的输入端口上。
  6. 在蓝图编辑器中,打开PrintPixels事件,将以下代码复制粘贴到事件中:
for (int i = 0; i < Pixels.Num(); i++)
{
    UE_LOG(LogTemp, Log, TEXT("Pixel %d: %d"), i, Pixels[i]);
}
  1. 在蓝图编辑器中,保存蓝图,并关闭蓝图编辑器。
  2. 在场景中添加该蓝图Actor,并将InputTexture设置为任意一张图片。
  3. 在场景中选中该蓝图Actor,打开蓝图属性面板,点击ReadPixels按钮,等待一段时间,直到Width和Height的值被更新为图片的宽度和高度。
  4. 在蓝图属性面板中,点击PrintPixels按钮,查看输出日志中的像素灰度值。
使用C++编写一个UE5的actor蓝图中可用的节点功能是根据输入的图片逐像素读取灰度并将灰度值输出到一个数组请提供完整的cpp和头文件代码并详细说明使用方法

原文地址: https://www.cveoy.top/t/topic/bMkh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录