Getting asset thumbnails as a Texture2D

I 'm trying to get the thumbnails of some existing assets and assign them to the UImage as a texture in the editor utility widget that I created. However, when I do with as follows, the returned textures look different and corrupted from their original versions in the content browser. Am I missing something , or Is there better way to obtain this ?

void UMBMaterialAssignmentSlot::SetSlotParams(const FAssetData& AssetData) 
{
    FString PackageFilename;
    const FName ObjectFullName = FName(*AssetData.GetFullName());
    TSet<FName> ObjectFullNames;
    ObjectFullNames.Add(ObjectFullName);
    if(FPackageName::DoesPackageExist(AssetData.PackageName.ToString(), &PackageFilename))
    {
        FThumbnailMap ThumbnailMap;
        ThumbnailTools::LoadThumbnailsFromPackage(PackageFilename,ObjectFullNames, 
        ThumbnailMap);

        ThumbnailMap.Find(ObjectFullName)->AccessImageData();

        const auto CreatedTexture = FImageUtils::ImportBufferAsTexture2D 
        (ThumbnailMap.Find(ObjectFullName)->AccessCompressedImageData());
        
        MaterialImage->SetBrushFromTexture(CreatedTexture);
    }
}

1

Basing off the staff’s post

I repurposed it for your thumbnail gen.

.build file needs "ImageWrapper" in dependencies

Includes

#include "IImageWrapper.h" 
#include "IImageWrapperModule.h" 

void UMBMaterialAssignmentSlot::SetSlotParams(const FAssetData& AssetData) {
    
    UTexture2D* CreatedTexture = nullptr;
    
    FString PackageFilename;
    const FName ObjectFullName = FName(*AssetData.GetFullName());
    TSet<FName> ObjectFullNames;
    ObjectFullNames.Add(ObjectFullName);
    if (FPackageName::DoesPackageExist(AssetData.PackageName.ToString(), &PackageFilename))
    {
        FThumbnailMap ThumbnailMap;
        ThumbnailTools::LoadThumbnailsFromPackage(PackageFilename, ObjectFullNames,
            ThumbnailMap);
                
        FObjectThumbnail* objTN = ThumbnailMap.Find(ObjectFullName);             

        IImageWrapperModule& ImageWrapperModule = FModuleManager::Get().LoadModuleChecked<IImageWrapperModule>(TEXT("ImageWrapper"));
        TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);

        ImageWrapper->SetRaw(objTN->GetUncompressedImageData().GetData(), objTN->GetUncompressedImageData().Num(), objTN->GetImageWidth(), objTN->GetImageHeight(), ERGBFormat::BGRA, 8);
        const TArray64<uint8>& CompressedByteArray = ImageWrapper->GetCompressed();

         CreatedTexture = FImageUtils::ImportBufferAsTexture2D(CompressedByteArray);        
                 
        MeshImage->SetBrushFromTexture(CreatedTexture);
    }    
}
2 Likes

It works perfectly. Thank you.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.