头文件代码:

#pragma once

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

/**
 * 
 */
UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintCallable, Category = "My Functions")
		static FLinearColor GetPixelColorFromTexture(UTexture2D* Texture, int32 X, int32 Y);
};

cpp代码:

#include "MyBlueprintFunctionLibrary.h"
#include "Engine/Texture2D.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Engine/Texture2DDynamic.h"

FLinearColor UMyBlueprintFunctionLibrary::GetPixelColorFromTexture(UTexture2D* Texture, int32 X, int32 Y)
{
	// Check if texture is valid
	if (!Texture)
	{
		UE_LOG(LogTemp, Error, TEXT("GetPixelColorFromTexture: Invalid texture"));
		return FLinearColor::Black;
	}

	// Get texture size
	FIntPoint TextureSize = Texture->GetImportedSize();

	// Check if coordinates are within texture bounds
	if (X < 0 || X >= TextureSize.X || Y < 0 || Y >= TextureSize.Y)
	{
		UE_LOG(LogTemp, Error, TEXT("GetPixelColorFromTexture: Coordinates out of bounds"));
		return FLinearColor::Black;
	}

	// Get texture data
	FTexture2DMipMap& Mip = Texture->PlatformData->Mips[0];
	void* Data = Mip.BulkData.Lock(LOCK_READ_ONLY);
	int32 BytesPerPixel = Mip.SizeX * Mip.SizeY * sizeof(FColor);
	uint8* Pixels = new uint8[BytesPerPixel];
	FMemory::Memcpy(Pixels, Data, BytesPerPixel);
	Mip.BulkData.Unlock();

	// Get pixel color
	int32 PixelIndex = (Y * TextureSize.X) + X;
	FColor PixelColor = ((FColor*)Pixels)[PixelIndex];

	// Free memory
	delete[] Pixels;

	return PixelColor.Linear();
}

使用方法:

在蓝图中添加一个节点,选择Category为“My Functions”,函数名为“Get Pixel Color From Texture”,输入参数为Texture(需要连接一个有图像的Texture2D)、X坐标和Y坐标,输出类型为LinearColor,即像素的颜色信息。


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

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