UE4 读取本地图片

来源:互联网 发布:淘宝网长款羽绒服 编辑:程序博客网 时间:2024/05/17 05:58

参考链接:https://answers.unrealengine.com/questions/235086/texture-2d-shows-wrong-colors-from-jpeg-on-html5-p.html


我这里,不能将图片全放工程之中,需要在外部在加载图片资源,再来使用


1.通过本地图片路径,获取图片,并将其数据转为uint类型的数组

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #pragma region 通过本地图片转换成UTexture2D  
  2. UTexture2D* AMyProjectGameMode::GetLocalTexture(const FString &_TexPath)  
  3. {  
  4.     UTexture2D* OutTex=NULL;  
  5.     IImageWrapperModule& imageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));  
  6.     IImageWrapperPtr imageWrapper = imageWrapperModule.CreateImageWrapper(EImageFormat::PNG);  
  7.   
  8.     TArray<uint8> OutArray;  
  9.     if(FFileHelper::LoadFileToArray(OutArray, *_TexPath))  
  10.     {  
  11.         if (imageWrapper.IsValid()&&  
  12.             imageWrapper->SetCompressed(OutArray.GetData(), OutArray.Num()))  
  13.         {  
  14.             const TArray<uint8>* uncompressedRGBA = NULL;  
  15.             if (imageWrapper->GetRaw(ERGBFormat::RGBA, 8, uncompressedRGBA))  
  16.             {  
  17.                 const TArray<FColor> uncompressedFColor=uint8ToFColor(*uncompressedRGBA);  
  18.                 OutTex=TextureFromImage(  
  19.                     imageWrapper->GetWidth(),  
  20.                     imageWrapper->GetHeight(),  
  21.                     uncompressedFColor,  
  22.                     true);  
  23.             }  
  24.         }  
  25.     }  
  26.     return OutTex;  
  27. }  
  28. #pragma endregion  
2.将uint8数组转为颜色数组

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #pragma region 将uint8数组转为颜色数组  
  2. TArray<FColor> AMyProjectGameMode::uint8ToFColor(const TArray<uint8> origin)  
  3. {  
  4.     TArray<FColor> uncompressedFColor;  
  5.     uint8 auxOrigin;  
  6.     FColor auxDst;  
  7.   
  8.     for (int i = 0; i < origin.Num(); i++) {  
  9.         auxOrigin = origin[i];  
  10.         auxDst.R = auxOrigin;  
  11.         i++;  
  12.         auxOrigin = origin[i];  
  13.         auxDst.G = auxOrigin;  
  14.         i++;  
  15.         auxOrigin = origin[i];  
  16.         auxDst.B = auxOrigin;  
  17.         i++;  
  18.         auxOrigin = origin[i];  
  19.         auxDst.A = auxOrigin;  
  20.         uncompressedFColor.Add(auxDst);  
  21.     }  
  22.   
  23.     return  uncompressedFColor;  
  24.   
  25. }  
  26. #pragma endregion  
3.将颜色数组赋值给Texture
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #pragma region 将颜色数组赋值给Texture  
  2. UTexture2D* AMyProjectGameMode::TextureFromImage(const int32 SrcWidth, const int32 SrcHeight, const TArray<FColor> &SrcData, const bool UseAlpha)   
  3. {  
  4.   
  5.     // 创建Texture2D纹理  
  6.     UTexture2D* MyScreenshot = UTexture2D::CreateTransient(SrcWidth, SrcHeight, PF_B8G8R8A8);  
  7.   
  8.     // 锁住他的数据,以便修改  
  9.     uint8* MipData = static_cast<uint8*>(MyScreenshot->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE));  
  10.   
  11.     // 创建纹理数据  
  12.     uint8* DestPtr = NULL;  
  13.     const FColor* SrcPtr = NULL;  
  14.     for (int32 y = 0; y<SrcHeight; y++)  
  15.     {  
  16.         DestPtr = &MipData[(SrcHeight - 1 - y) * SrcWidth * sizeof(FColor)];  
  17.         SrcPtr = const_cast<FColor*>(&SrcData[(SrcHeight - 1 - y) * SrcWidth]);  
  18.         for (int32 x = 0; x<SrcWidth; x++)  
  19.         {  
  20.             *DestPtr++ = SrcPtr->B;  
  21.             *DestPtr++ = SrcPtr->G;  
  22.             *DestPtr++ = SrcPtr->R;  
  23.             if (UseAlpha)  
  24.             {  
  25.                 *DestPtr++ = SrcPtr->A;  
  26.             }  
  27.             else  
  28.             {  
  29.                 *DestPtr++ = 0xFF;  
  30.             }  
  31.             SrcPtr++;  
  32.         }  
  33.     }  
  34.   
  35.     // 解锁纹理  
  36.     MyScreenshot->PlatformData->Mips[0].BulkData.Unlock();  
  37.     MyScreenshot->UpdateResource();  
  38.   
  39.     return MyScreenshot;  
  40. }  
  41. #pragma endregion  
4.我这里建图片路径放在工程的相对路径下,调用GetLocalTexture函数,获取Texture2D

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void AMyProjectGameMode::BeginPlay()  
  2. {  
  3.     const FString _FilePath = FPaths::GameDir() + "video_logo.png";  
  4.     _UITex = GetLocalTexture(_FilePath);  
  5. }  
5.注意别忘了,需要添加两个头文件

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "Runtime/ImageWrapper/Public/Interfaces/IImageWrapper.h"  
  2. #include "Runtime/ImageWrapper/Public/Interfaces/IImageWrapperModule.h"  
6.运行截图,我这里将获取的图片放在了UI界面上

7.我在读取jpg格式的图片的时候,颜色明显不对,读png的格式的时候,就完全正常,还未去寻找原因


本文转自:http://blog.csdn.net/qq992817263/article/details/52704475

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 同校生2高潮了怎么办 经期血发黑量少怎么办 电脑键盘右边数字键不能用怎么办 御宅伴侣特别卡怎么办 电脑网络出现三角叹号怎么办 同校生2卡顿怎么办 电脑卡了没反应怎么办 促排卵泡多要怎么办 把朋友搞摔倒意外死亡怎么办 猫见到狗受惊了怎么办 头被桌子撞肿了怎么办 鱼缸里的鱼缺氧怎么办 上火眼皮打拉下来怎么办 小孩头敲了个包怎么办 四个月不吃奶怎么办啊 4个月宝宝不吃奶粉怎么办 3个月婴儿不喝奶怎么办 地图舌加裂纹舌怎么办 3个月宝宝厌食怎么办 宝宝不吃奶吃手怎么办 三个月的宝宝光吃手不吃奶怎么办 九个月宝宝积热怎么办 前门牙露神经了怎么办 7岁宝宝吐舌头怎么办 连续液精几个月了怎么办 接吻时对方伸舌头我要怎么办 亲嘴不想让对方伸舌头怎么办 喝醉酒想吐吐不出来怎么办 凉了胃怎么办喝什么药 生宝宝后屁股扁了怎么办 屁股又宽又扁怎么办 烫伤一年多色差没有恢复怎么办 上古卷轴5不能动怎么办 上古卷轴ol卡死怎么办 小妹妹这么骚长大了怎么办 同事借钱忘了还怎么办 怀了二胎想离婚怎么办 如果闺蜜疏远了怎么办 考上博士但是硕士要延期怎么办 硕士延期也不能毕业怎么办 硕士论文工作量太少被延期了怎么办