Images
ImageWrapper作为所有图片类型的抽象层:
- 图片文件自身的数据是压缩后的数据成为 CompressedData。
- 图片文件对应的真正的 RGBA 数据,是没有压缩的,且与格式无关的数据称为 RawData。
- 同样的图片保存为不同的格式,RawData 不变,CompressedData 不同。
- 所有的图片格式被抽象为一个 ComressedData 和 RawData 的组合。
读取 JPG 图片
- 从文件中读取为 TArray 的二进制数据
- 用 SetCompressData 填充压缩数据
- 使用 GetRawData 即可获取 RGB 数据
转换 PNG 图片到 JPG
- 从文件中读取为 TArray 的二进制数据
- 用 SetCompressData 填充为压缩数据
- 将 RGB 数据填充到 JPG 类型的 ImageWrapper 中
- 使用 GetCompressData,即可获得压缩后的 JPG 数据
- 使用 FFileHelper 写入到文件中
代码:
bool FSystemToolsPublic::CovertPNG2JPG(const FString &SourceName, const FString &TargetName)
{
check(SourceName.EndsWith(TEXT(".png")) && TargetName.EndsWith(TEXT(".jpg")));
IImageWrapperModule &ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
IImageWrapperPtr SourceImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);
IImageWrapperPtr TargetImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
TArray<uint8> SourceImageData;
TArray<uint8> TargetImageData;
int32 Width, Height;
const TArray<uint8> *UncompressedRGBA = nullptr;
if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*SourceName))
;
{
//文件不存在
return false;
}
if (!FFileHelper::LoadFileToArray(SourceImageData, *SourceName))
{
//文件读取失败
return false;
}
if (SourceImageWrapper.IsValid() && SourceImageWrapper->SetCompressed(SourceImageData.GetData(), SourceImageData.Num()))
{
if (SourceImageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))
{
Height = SourceImageWrapper->GetHeight();
Width = SourceImageWrapper->GetWidth();
if (TargetImageWrapper->SetRaw(UncompressedRGBA->GetData(), UncompressedRGBA->Num(), Width, Height, ERGBFormat::RGBA, 8))
{
TargetImageData = TargetImageWrapper->GetCompressed();
if (!FFileManagerGeneric::Get().DirectoryExists(*TargetName))
{
FFileManagerGeneric::Get().MakeDirectory(*FPaths::GetPath(TargetName), true);
}
return FFileHelper::SaveArrayToFile(TargetImageData, *TargetName);
}
}
}
return false;
}
- 读取压缩过的图片文件到二进制数组,获取图片压缩后的数据。
- 将压缩后的数据借助 ImageWrapper 的 GetRaw 转换为原始 RGB 数据。
- 填充原始的 RGB 数据到 UTexture 的数据中。
UTexture2D *FSystemToolsPublic::LoadTexture2DFromFilePath(FString &ImagePath, int32 &OutWidth, int32 &OutHeight)
{
//文件是否存在
if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath))
{
return nullptr;
}
//读取文件资源
TArray<uint8> CompressedData;
if (!FFileHelper::LoadFileToArray(CompressedData, *ImagePath))
{
return nullptr;
}
return LoadTexture2DFromBytesAndExtension(ImagePath, CompressedData.GetData(), ComressedData.Num(), OutWidth, OutHeight);
}

浙公网安备 33010602011771号