use Aspose\Imaging\Configuration;
use Aspose\Imaging\ImagingApi;
use Aspose\Imaging\Model\Requests\CreateGrayscaledImageRequest;
use Aspose\Imaging\Model\Requests\GrayscaleImageRequest;
use Exception; 

// Get ClientId and ClientSecret from https://dashboard.aspose.cloud/ 
// or use on-premise version (https://docs.aspose.cloud/imaging/getting-started/how-to-run-docker-container/)

$ImageFileName = "example_image.wmf";
$ImagesFolder = "ExampleImages";
$CloudFolder = "CloudImages";
$OutputFolder = "Output";

$clientSecret = null;
$clientId = null;
$baseUrl = "https://api.aspose.cloud";

$imagingConfig = new Configuration();
$imagingConfig->setClientSecret($clientSecret);
$imagingConfig->setClientId($clientId);
$imagingConfig->setBaseUrl($baseUrl);

$imagingApi = new ImagingApi($imagingConfig);

/**
* Grayscale an image from cloud storage.
*/
public function GrayscaleImageFromStorage()
{
    $this->UploadSampleImageToCloud();

    $inputImage = file_get_contents($this->ImagesFolder . DIRECTORY_SEPARATOR . $this->ImageFileName);
    $request = new UploadFileRequest($this->CloudPath . DIRECTORY_SEPARATOR . $this->ImageName, $inputImage);
    $response = self::$imagingApi->uploadFile($request);
    if ($response->getErrors() != null && count($response->getErrors()) == 0)
        echo ("Uploading errors count: " . count($response->getErrors()));
    
    $folder = $this->CloudFolder; // Input file is saved at the desired folder in the storage
    $storage = null; // We are using default Cloud Storage

    $request = new GrayscaleImageRequest($this->ImageFileName, $folder, $storage);
    $updatedImage = self::$imagingApi->grayscaleImage($request);

    // Save the image file to output folder
    $updatedImageName = "updated_" . $this->ImageFileName; 
    $path = $this-> OutputFolder . DIRECTORY_SEPARATOR . $updatedImageName;
    file_put_contents($path, $updatedImage);
}

/**
* Grayscale an image. Image data is passed in a request stream.
*/
public function CreateGrayscaledImageFromRequest()
{    
    $outPath = null; // Path to updated file (if this is empty, response contains streamed image)
    $storage = null; // We are using default Cloud Storage

    $inputStream = file_get_contents($this->ImagesFolder . DIRECTORY_SEPARATOR . $this->ImageFileName);
    $request = new CreateGrayscaledImageRequest($inputStream, $outPath, $storage); 
    $updatedImage = self::$imagingApi->createGrayscaledImage($request);

    // Save the image file to output folder
    $updatedImageName = "updated_" . $this->ImageFileName; 
    $path = $this-> OutputFolder . DIRECTORY_SEPARATOR . $updatedImageName;
    file_put_contents($path, $updatedImage);
}