UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法

  • 现象
  • 解决方案
    • 具体方法

现象

用UE自带的 DownloadImage 无法下载成功,从 failure 引脚出来。
接入一个由监控器自动保存起的图像,有些可以正常加载成功,有些无法加载成功。
经调查问题出现在,有些由监控摄像头保存起来的图片的格式不符合UE的格式要求。有可能是没有MipMap的设置。
所以无法通过 【FImageUtils::ImportBufferAsTexture2D】将下载下来的图片二进制数据转换成Texture2D;
也无法通过将 【FFileHelper::SaveArrayToFile(ImageData, SavePath)】保存好的图片,通过
【UTexture2D
Texture = FImageUtils::ImportFileAsTexture2D(ImagePath);】导入生成 UTexture2D

解决方案

自己写一个download的方法,下载到图片的二进制数据,然后通过一个开源库 【stb_image.h】将图片重写入一个Texture2D
,重写的过程可以设定所需的一些格式。

具体方法

写一个DownloadImage的http请求,然后再写一个请求回调的方法,在请求成功后将二进制数据进行读取并写入 UTexture2D 对象

引入第三方库
在【Source】文件夹中创建第三方库文件夹,然后放入下载的库文件。只需要下载这一个文件就够了
下载地址
在这里插入图片描述
配置build.cs
在build.cs里增加一个引用文件的配置
在这里插入图片描述
在一个actor或者 UBlueprintAsyncActionBase 的子类里编写调用方法

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDownloadAsyncNodeResult, UTexture2D*, tex2D);
/*** */
UCLASS()
class JGF_5_API UJGF_Http : public UBlueprintAsyncActionBase
{GENERATED_BODY()UPROPERTY(BlueprintAssignable)FDownloadAsyncNodeResult OnSuccess;UPROPERTY(BlueprintAssignable)FDownloadAsyncNodeResult OnFail;FTimerHandle TimerHandle;UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"))static UJGF_Http* CallDownloadImage(UObject* WorldContextObject,  FString url,FString path="Data/DownloadImg/");uint16 checkCount=0;UTexture2D* Text2D;void DownloadImage(const FString& ImageURL, const FString& SavePath);void OnImageDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FString SavePath);};

// Fill out your copyright notice in the Description page of Project Settings.#include "UtilityComponents/Http/JGF_Http.h"#include "HttpModule.h"
#include "ImageUtils.h"
#include "Interfaces/IHttpResponse.h"
#include "Kismet/GameplayStatics.h"
#include "ThirdParty/stb_image/stb_image.h"UJGF_Http* UJGF_Http::CallDownloadImage(UObject* WorldContextObject, FString url, FString path)
{auto node=NewObject<UJGF_Http>();FString FileName = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());FileName = FileName.Append(path);node ->DownloadImage(url,FileName);auto check=[node,WorldContextObject,url](){if(node->Text2D!=nullptr){node->OnSuccess.Broadcast(node->Text2D);WorldContextObject->GetWorld()->GetTimerManager().ClearTimer(node->TimerHandle);}else{node->checkCount++;if(node->checkCount>100){node->OnFail.Broadcast(nullptr);WorldContextObject->GetWorld()->GetTimerManager().ClearTimer(node->TimerHandle);}}};WorldContextObject->GetWorld()->GetTimerManager().SetTimer(node->TimerHandle,FTimerDelegate::CreateLambda(check),0.1f,true);return  node;
}void UJGF_Http::DownloadImage(const FString& ImageURL, const FString& SavePath)
{// 创建 HTTP 请求对象TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();HttpRequest->OnProcessRequestComplete().BindUObject(this, &UJGF_Http::OnImageDownloadComplete, SavePath);HttpRequest->SetURL(ImageURL);HttpRequest->SetVerb("GET");HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("image/jpeg"));HttpRequest->ProcessRequest();
}void UJGF_Http::OnImageDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful,FString SavePath)
{if (bWasSuccessful){// 获取图片数据const TArray<uint8>& ImageData = Response->GetContent();// 将数据转换为 `stb_image` 支持的格式int32 Width, Height, Channels;unsigned char* ImageData_1 = stbi_load_from_memory(ImageData.GetData(), ImageData.Num(), &Width, &Height, &Channels, 0);if (!ImageData_1){return;}UTexture2D* Texture = UTexture2D::CreateTransient(Width, Height);if (Texture){// 锁定 BulkData 以便修改FTexture2DMipMap& Mip = Texture->PlatformData->Mips[0];void* TextureData = Mip.BulkData.Lock(LOCK_READ_WRITE);// 根据图片通道数处理图像数据FColor* Pixels = new FColor[Width * Height];int32 PixelIndex = 0;for (int32 y = 0; y < Height; ++y){for (int32 x = 0; x < Width; ++x){int32 Index = (y * Width + x) * Channels;// 确保按照正确的通道顺序进行复制if (Channels == 4)  // RGBA{Pixels[PixelIndex++] = FColor(ImageData_1[Index + 0], ImageData_1[Index + 1], ImageData_1[Index + 2], ImageData_1[Index + 3]);}else if (Channels == 3)  // RGB, 默认 alpha = 255{Pixels[PixelIndex++] = FColor(ImageData_1[Index + 0], ImageData_1[Index + 1], ImageData_1[Index + 2], 255);}}}// 将像素数据复制到纹理中FMemory::Memcpy(TextureData, Pixels, Width * Height * sizeof(FColor));// 解锁 BulkDataMip.BulkData.Unlock();// 释放临时图像数据和像素数据stbi_image_free(ImageData_1);delete[] Pixels;// 更新纹理资源Texture->UpdateResource();}if(Texture)Text2D=Texture;//Text2D= FImageUtils::ImportBufferAsTexture2D(ImageData);// 保存到本地文件//FFileHelper::SaveArrayToFile(ImageData, *SavePath);// 调用处理和加载图片的函数//ProcessAndLoadImage(SavePath);}else{UE_LOG(LogTemp, Warning, TEXT("Image download failed"));}
}

代码说明
在这里插入图片描述

注 【SavePath】参数暂时无用,并没有保存到本地
在actor中调用【CallDownloadImage】进行下载
在进而调用了【DownloadImage】进行http下载文件
完成后回调到【OnImageDownloadComplete】,进行数据处理
处理过程中,直接将二进制图片数据通过stb_image库重新转化一遍成 char* ,写入 FColor 再在写入 UTexture2D 对象RGB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类&#xff1a;编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值的称为编码键盘&#xff0c;如&#xff1a;计算机键盘。靠软件编程识别的称为非编码键盘&#xff1b;在单片机组成…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代&#xff0c;大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力&#xff0c;为AI算法提供了丰富的原材料&#xff0c;助力其挖掘出有价值的洞见&#xff0c;推动明智决策的制…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

故障字故障码 简单介绍

一、故障字 1.1故障字的概念 故障字&#xff08;Fault Word&#xff09;是一种常用的技术术语&#xff0c;主要应用在工业控制、嵌入式系统和通信领域&#xff0c;用于表示系统状态或故障信息。它是一个以位为单位的编码方式&#xff0c;每个位&#xff08;bit&#xff09;对应…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接&#xff1a; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分&#xff08;数组分块&#xff09;&#xff0c;就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…

66 mysql 的 表自增长锁

前言 mysql 的表锁之 AUTO_INC, 是我们自增长的时候做并发控制的锁 主要是用于 自增长生成新的 id 的时候的控制 在前面的文档中, 我们又看到 mysql 这边自增长的处理的相关的大概脉络 但是 对于一些 并发控制的细节, 我们当时 应该是直接忽略掉了 我们这里就来看一下…

Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

续 上集说到语义搜索&#xff0c;这集接着玩一下图搜图&#xff0c;这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索&#xff0c;代码逻辑结构都很类似… 开搞 还是老地方modelscope找个Vision Transformer模型&#xff0c;这里选用vit-base-patch16-224…

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间&#xff1f; &#xff08;a&#xff09; 为了实现可靠的关闭 &#xff08;b&#xff09;为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…

docker搭建私有仓库,实现镜像的推送和拉取

1.拉取docker仓库镜像 docker pull registry 2.启动registry容器 docker run -d registry 3.查看当前仓库中存在的镜像&#xff08;一&#xff09; curl -XGET http://192.168.111.162: 5000/v2/_catalog 192.168.111.162 部署docker仓库宿主机的ip 5000 部署docker仓库映射到宿…

提取图片高频信息

提取图片高频信息 示例-输入&#xff1a; 示例-输出&#xff1a; 代码实现&#xff1a; import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…