UE5 获取各个信息的像素

UFUNCTION(BlueprintCallable,BlueprintPure)
	static TArray<FColor> GetMediaTexturePixels(UMediaTexture* MyMediaTexture)
	{
		TArray<FColor> PixelColorsArr;
		UTexture2D* UT2 = MediaTextureToTexture2D(MyMediaTexture);
		const FColor* const Colors = static_cast<FColor*>(UT2->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_ONLY));
		uint16 OutX = UT2->GetSizeX();
		uint16 OutY = UT2->GetSizeY();
		for(int i = 0; i < OutY; i++)
		{
			for(int j = 0; j < OutX; j++)
			{
				FColor PixelColor = Colors[i * OutX + j];
				PixelColorsArr.Add(PixelColor);
			}
		}
		UT2->PlatformData->Mips[0].BulkData.Unlock();
		return PixelColorsArr;
	}
	
	UFUNCTION(BlueprintCallable,BlueprintPure)
	static UTexture2D* MediaTextureToTexture2D(UMediaTexture* MyMediaTexture)
	{
		check(IsInGameThread());
		TArray<FColor> OutColors;
		FMediaTextureResource* MediaTextureResource = static_cast<FMediaTextureResource*>(MyMediaTexture->GetResource());
		MediaTextureResource->ReadPixels(OutColors);

		UTexture2D* NewTexture2D = nullptr;
		void* TextureData = nullptr;
		const int32 ImageWidth = MyMediaTexture->GetWidth();
		const int32 ImageHeight = MyMediaTexture->GetHeight();
		UE_LOG(LogTemp, Warning, TEXT("ImageWidth:%d"), ImageWidth);
		UE_LOG(LogTemp, Warning, TEXT("ImageHeight:%d"), ImageHeight);

		NewTexture2D = UTexture2D::CreateTransient(ImageWidth, ImageHeight, PF_B8G8R8A8, FName(TEXT("测试贴图")));

		FTexture2DMipMap& Mipmap = NewTexture2D->GetPlatformData()->Mips[0];
		TextureData = Mipmap.BulkData.Lock(LOCK_READ_WRITE);

		FMemory::Memcpy(TextureData, OutColors.GetData(), OutColors.Num() * 4);
		Mipmap.BulkData.Unlock();
		NewTexture2D->UpdateResource();
		Mipmap.BulkData.Unlock();
		
		return NewTexture2D;
	}

这里有两个类型的像素

一个是UTexture2D的像素

二是UMediaTexture的像素


static FColor GetScreenPositionColor(POINT P)
	{
        Windows::HDC hdc = ::GetDC(NULL);
        COLORREF Color = ::GetPixel(hdc, P.x, P.y);
        int R = GetRValue(Color);
        int G = GetGValue(Color);
        int B = GetBValue(Color);
        ::ReleaseDC(NULL, hdc);
        FColor realColor = FColor(R, G, B);
        
        return realColor;
	}
	UFUNCTION(BlueprintCallable)
	static TArray<FColor> GetScreenColors()
	{
		TArray<FColor> ScreenColors;
		for(int y = 0; y < 1080; y++)
		{
			for(int x = 0; x < 1920; x++)
			{
				ScreenColors.Add(GetScreenPositionColor(POINT{x, y}));
			}
		}
		return ScreenColors;
	}

这里使用Windows的HDC来获取屏幕中所有像素,这个不适合获取屏幕上所有像素,速度很慢,适合做取色器来获取其中鼠标中的一个像素


UFUNCTION(BlueprintCallable)
	static TArray<FColor> GetPixelsFromSceneCapture(USceneCaptureComponent2D* scc)
	{
		TArray<FColor> Pixels;
		scc->TextureTarget->GameThread_GetRenderTargetResource()->ReadPixels(Pixels);
		return Pixels;
	}

获取场景捕获器中,捕获的RT中所有的像素

相关推荐
Ajiang28247353041 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
ggdpzhk1 小时前
VUE:基于MVVN的前端js框架
前端·javascript·vue.js
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
小曲曲2 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•3 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS4 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
活宝小娜6 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点6 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow6 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js