Images

ImageWrapper作为所有图片类型的抽象层:

  1. 图片文件自身的数据是压缩后的数据成为 CompressedData。
  2. 图片文件对应的真正的 RGBA 数据,是没有压缩的,且与格式无关的数据称为 RawData。
  3. 同样的图片保存为不同的格式,RawData 不变,CompressedData 不同。
  4. 所有的图片格式被抽象为一个 ComressedData 和 RawData 的组合。

读取 JPG 图片

  1. 从文件中读取为 TArray 的二进制数据
  2. 用 SetCompressData 填充压缩数据
  3. 使用 GetRawData 即可获取 RGB 数据

转换 PNG 图片到 JPG

  1. 从文件中读取为 TArray 的二进制数据
  2. 用 SetCompressData 填充为压缩数据
  3. 将 RGB 数据填充到 JPG 类型的 ImageWrapper 中
  4. 使用 GetCompressData,即可获得压缩后的 JPG 数据
  5. 使用 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;
}
  1. 读取压缩过的图片文件到二进制数组,获取图片压缩后的数据。
  2. 将压缩后的数据借助 ImageWrapper 的 GetRaw 转换为原始 RGB 数据。
  3. 填充原始的 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);
}
posted @ 2019-10-15 08:06  CodeWithMe  阅读(720)  评论(0)    收藏  举报