直接上代码吧。
void UTestShaderBlueprintLibrary::ExportTexture(UTexture2D* TextureToBeExpot)
{
//TextureToBeExpot->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
//TextureToBeExpot->SRGB = 0;
//TextureToBeExpot->UpdateResource();
//TextureToBeExpot->Source.BulkData
FTexture2DMipMap& mipmap = TextureToBeExpot->PlatformData->Mips[4];
void* Data = mipmap.BulkData.Lock(LOCK_READ_WRITE);
uint32* PixelPointer = (uint32*)Data;
if (PixelPointer == nullptr)
{
mipmap.BulkData.Unlock();
return;
}
int32 texturex = TextureToBeExpot->PlatformData->SizeX;
int32 texturey = TextureToBeExpot->PlatformData->SizeY;
TArray<uint8>colors;
colors.AddUninitialized(texturex * texturey * 4);
for (int32 x = 0; x < texturex * texturey; x++)
{
uint32 EncodedPixel = *PixelPointer;
//B
colors[4 * x] = (EncodedPixel & 0x000000FF);
//G
colors[4 * x + 1] = (EncodedPixel & 0x0000FF00) >> 8;
//R
colors[4 * x + 2] = (EncodedPixel & 0x00FF0000) >> 16;
//A
colors[4 * x + 3] = (EncodedPixel & 0xFF000000) >> 24;
PixelPointer++;
}
mipmap.BulkData.Unlock();
//----------------------------------------------------------//
// Texture Information
int width = texturex;
int height = texturey;
FString FileName = TextureToBeExpot->GetFName().ToString();
// Create Package
FString pathPackage = FString("/Game/MyTextures/") + FileName;
//FString absolutePathPackage = FPaths::ProjectContentDir() + "/MyTextures/";
//FPackageName::RegisterMountPoint(*pathPackage, *absolutePathPackage);
UPackage * Package = CreatePackage(nullptr, *pathPackage);
// Create the Texture
//FName TextureName = MakeUniqueObjectName(Package, UTexture2D::StaticClass(), FName(*FileName));
//FName TextureName = FPaths::GetBaseFilename(absolutePathPackage);
UObject* TexObj = NewObject<UTexture2D>(Package, TextureToBeExpot->GetFName(), RF_Public | RF_Standalone);
UTexture2D* Texture = Cast<UTexture2D>(TexObj);
Texture->Source.Init(width, height, /*NumSlices=*/ 1, /*NumMips=*/ 1, TSF_BGRA8, colors.GetData());
Texture->PlatformData = new FTexturePlatformData();
Texture->PlatformData->SizeX = width;
Texture->PlatformData->SizeY = height;
Texture->PlatformData->PixelFormat = PF_B8G8R8A8;
//Texture->Source.Format =
// Passing the pixels information to the texture
FTexture2DMipMap* Mip = new(Texture->PlatformData->Mips) FTexture2DMipMap();
Mip->SizeX = width;
Mip->SizeY = height;
Mip->BulkData.Lock(LOCK_READ_WRITE);
uint8* TextureData = (uint8 *)Mip->BulkData.Realloc(height * width * sizeof(uint8) * 4);
FMemory::Memcpy(TextureData, colors.GetData(), sizeof(uint8) * height * width * 4);
Mip->BulkData.Unlock();
// Updating Texture & mark it as unsaved
Texture->AddToRoot();
FAssetRegistryModule::AssetCreated(Texture);
Texture->UpdateResource();
Package->SetDirtyFlag(true);
//Texture->PostEditChange();
UE_LOG(LogTemp, Log, TEXT("Texture created: %s"), &FileName);
//---------------------------------------------------------//
//TextureToBeExpot->
//FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, false, /*bPromptToSave=*/ false);
FAssetToolsModule& AssetToolModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
IAssetTools& AssetTool = AssetToolModule.Get();
TArray<UObject*>Textures;
Textures.Add(Texture);
AssetTool.ExportAssetsWithDialog(Textures, true);
}
注意package的路径,如果路径不对资源将创建失败。