Browse our Products

Aspose.Imaging for .NET 25.10 - Release notes

Competitive features:

  • Extend Exif metadata support for raster image formats
KeySummaryCategory
IMAGINGNET-7620Extend Exif metadata support for raster image formatsFeature
IMAGINGNET-7762Reduce memory on decoding Tiff and speed up Tiff Lzw compressed savingEnhancement
IMAGINGNET-7757Gif:Incorrect inflate resize.Enhancement
IMAGINGNET-7659Add a method to create an image from existing pixels dataEnhancement
IMAGINGNET-7623Cannot open the Tiff image (NRE)Enhancement

Public API changes:

Added APIs:

Class Aspose.Imaging.IMetadataContainer

Class Aspose.Imaging.Metadata.IImageMetadataFormat

Class Aspose.Imaging.Metadata.ImageMetadata

Method Aspose.Imaging.Exif.ExifData.#ctor(Aspose.Imaging.Exif.ExifData)

Method Aspose.Imaging.FileFormats.Tiff.TiffFrame.RotateFlip(Aspose.Imaging.RotateFlipType)

Method Aspose.Imaging.FileFormats.Webp.WebPImage.GetOriginalOptions

Method Aspose.Imaging.Image.Create (Aspose.Imaging.ImageOptionsBase,System.Int32,System.Int32,System.Int32[])

Method Aspose.Imaging.Image.TrySetMetadata(Aspose.Imaging.Metadata.IImageMetadataFormat)

Method Aspose.Imaging.ImageOptionsBase.TrySetMetadata (Aspose.Imaging.Metadata.IImageMetadataFormat)

Method Aspose.Imaging.IMetadataContainer.TrySetMetadata (Aspose.Imaging.Metadata.IImageMetadataFormat)

Method Aspose.Imaging.Metadata.ImageMetadata.TrySetMetadata (Aspose.Imaging.Metadata.IImageMetadataFormat)

Method Aspose.Imaging.RasterImage.AutoRotate

Property Aspose.Imaging.Exif.ExifData.Thumbnail

Property Aspose.Imaging.Image.ExifData

Property Aspose.Imaging.Image.Metadata

Property Aspose.Imaging.Image.XmpData

Property Aspose.Imaging.ImageOptionsBase.ExifData

Property Aspose.Imaging.Metadata.ImageMetadata.ExifData

Property Aspose.Imaging.Metadata.ImageMetadata.XmpData

Property Aspose.Imaging.RasterCachedMultipageImage.Metadata

Property Aspose.Imaging.VectorMultipageImage.Metadata

Removed APIs:

Field/Enum Aspose.Imaging.RasterImage.xmpData

Method Aspose.Imaging.FileFormats.Jpeg.JpegImage.AutoRotate

Property Aspose.Imaging.Exif.JpegExifData.Thumbnail

Property Aspose.Imaging.FileFormats.Apng.ApngImage.XmpData

Property Aspose.Imaging.FileFormats.Gif.GifImage.XmpData

Property Aspose.Imaging.FileFormats.Jpeg.JpegImage.XmpData

Property Aspose.Imaging.FileFormats.Jpeg2000.Jpeg2000Image.XmpData

Property Aspose.Imaging.FileFormats.Png.PngImage.XmpData

Property Aspose.Imaging.FileFormats.Svg.SvgImage.XmpData

Property Aspose.Imaging.FileFormats.Tiff.TiffFrame.ExifData

Property Aspose.Imaging.FileFormats.Tiff.TiffFrame.XmpData

Property Aspose.Imaging.FileFormats.Tiff.TiffImage.ExifData

Property Aspose.Imaging.RasterCachedMultipageImage.XmpData

Property Aspose.Imaging.RasterImage.XmpData

Usage Examples:

IMAGINGNET-7762 Reduce memory on decoding Tiff and speed up Tiff Lzw compressed saving

using (RasterImage image = (RasterImage)Image.Load("test.tiff"))
{
    image.Save("result.png", new PngOptions());
}

{

IMAGINGNET-7757 Gif:Incorrect inflate resize.

using (GifImage image = (GifImage)Image.Load("test.gif"))
    {
        image.ResizeFullFrame(200, 200);
        image.Save("test_out.gif");
    }

image.ResizeFullFrame(2000, 2000);
{

IMAGINGNET-7659 Add a method to create an image from existing pixels data

using System;

int imageWidth = 100;
int imageHeight = 100;

int[] sourceArray = new int[imageWidth * imageHeight];
int colorArgb32 = Aspose.Imaging.Color.Yellow.ToArgb();

for (int i = 0; i < sourceArray.Length; i++)
{
    sourceArray[i] = colorArgb32;
}

using (var image = (RasterImage)Image.Create(
           new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha },
           imageWidth,
           imageHeight,
           sourceArray
           )
      )
{
    var pixels = image.LoadArgb32Pixels(image.Bounds);
    Random rnd = new Random();
    Console.WriteLine($"Random pixel image color is {pixels[rnd.Next(0, pixels.Length)]}. Original Color value is {colorArgb32}");
}

{

IMAGINGNET-7623 Cannot open the Tiff image (NRE)

Try to load corrupted Tiff file:
using (var image = Image.Load(inputPath, new LoadOptions { DataRecoveryMode = DataRecoveryMode.ConsistentRecover, }))
{
    // No ImageLoadException due to InvalidDataException occurs
}

{

IMAGINGNET-7620 Extend Exif metadata support for raster image formats

public static void EditSourceImageMetadata(string inputPath)
{
    var outputPath = inputPath + $" with edited original metadata{Path.GetExtension(inputPath)}";

    using var image = Image.Load(inputPath);

    if (image.XmpData != null)
    {
        var newPackage = new XmpBasicPackage();
        newPackage.AddValue("New key", "New value");

        image.XmpData.AddPackage(newPackage);
    }

    if (image.ExifData != null)
    {
        image.ExifData.Orientation = ExifOrientation.RightTop;
    }

    image.Save(outputPath);
}

public static void ExportSourceImageMetadata(string inputPath, string outputPath, ImageOptionsBase outputOptions)
{
    using var inputImage = Image.Load(inputPath);

    // Set KeepMetadata to true to export inputImage metadata profiles, if outputOptions instance does not contain ones.
    outputOptions.KeepMetadata = true;

    inputImage.Save(outputPath, outputOptions);
}

public static void OverwriteSourceImageMetadata(string inputPath, string outputPath, ImageOptionsBase outputOptions)
{
    using var image = Image.Load(inputPath);

    var newMetadata = GetNewMetadata();

    // Try to set metadata, if the image format support metadata format type.
    foreach (var metadata in newMetadata)
    {
        if (outputOptions.TrySetMetadata(metadata))
        {
            Console.WriteLine($"{outputOptions.GetType().Name} image supports {metadata.GetType()}");
        }
    }

    // Or set metadata directly without image and metadata format compatibility check.
    outputOptions.ExifData = Array.Find(newMetadata, m => m is ExifData) as ExifData;
    outputOptions.XmpData = Array.Find(newMetadata, m => m is XmpPacketWrapper) as XmpPacketWrapper;

    image.Save(outputPath, outputOptionsClone);
}

public static IImageMetadataFormat[] GetNewMetadata()
{
    var xmpData = new XmpPacketWrapper();
    var xmpPackage = new XmpBasicPackage();
    xmpPackage.AddValue("User key", "User value");
    xmpData.AddPackage(xmpPackage);

    return new IImageMetadataFormat[]
    {
        xmpData,
        new ExifData
        {
            Orientation = ExifOrientation.RightTop,
        },
    };
}

{