Изображение создано с ног на голову в Android - PullRequest
0 голосов
/ 26 сентября 2019

Я использую следующий код для экспорта SceneCaptureComponent в виде изображения PNG на устройстве, и я столкнулся со странной проблемой.На Windows и iOS все работает как положено.На Android изображение вверх ногами, как будто оно повернуто на 180 градусов.Любые намеки почему?

bool UsaveJPG::SaveImage(class USceneCaptureComponent2D* Target, const FString ImagePath, const FLinearColor ClearColour)
{

        FRenderTarget* RenderTarget = Target->TextureTarget->GameThread_GetRenderTargetResource();
    if (RenderTarget == nullptr)
    {
        return false;
    }

    TArray<FColor> RawPixels;

    // Format not supported - use PF_B8G8R8A8.
    if (Target->TextureTarget->GetFormat() != PF_B8G8R8A8)
    {
        // TRACEWARN("Format not supported - use PF_B8G8R8A8.");
        return false;
    }

    if (!RenderTarget->ReadPixels(RawPixels))
    {
        return false;
    }

    // Convert to FColor.
    FColor ClearFColour = ClearColour.ToFColor(false); // FIXME - want sRGB or not?

    for (auto& Pixel : RawPixels)
    {
        // Switch Red/Blue changes.
        const uint8 PR = Pixel.R;
        const uint8 PB = Pixel.B;
        Pixel.R = PB;
        Pixel.B = PR;

        // Set alpha based on RGB values of ClearColour.
        Pixel.A = ((Pixel.R == ClearFColour.R) && (Pixel.G == ClearFColour.G) && (Pixel.B == ClearFColour.B)) ? 0 : 255;
    }

    TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);

    const int32 Width = Target->TextureTarget->SizeX;
    const int32 Height = Target->TextureTarget->SizeY;

    if (ImageWrapper.IsValid() && ImageWrapper->SetRaw(&RawPixels[0], RawPixels.Num() * sizeof(FColor), Width, Height, ERGBFormat::RGBA, 8))
    {
        FFileHelper::SaveArrayToFile(ImageWrapper->GetCompressed(), *ImagePath);
        return true;
    }

    return false;
}
...