Aspose.Imaging for .NET 17.12 - Release Notes

KeySummaryCategory
IMAGINGNET-2572Support for converting CMYK PSD to CMYK TIFFFeature
IMAGINGNET-2636Darker colors and color reproducibilityEnhancement
IMAGINGNET-2620When PSD is converted to PNG, an ArgumentOutOfRangeException occursEnhancement
IMAGINGNET-2619GIF not properly converted to PNGEnhancement
IMAGINGNET-2618Exception on saving Tiff ImageEnhancement
IMAGINGNET-2617Fix PSD test rendering for specific caseEnhancement
IMAGINGNET-2614Fix PSD crop operationEnhancement
IMAGINGNET-2612Exception on converting EMF to SVGEnhancement
IMAGINGNET-2610Image saving failed when saving JPEG2000 as PNGEnhancement
IMAGINGNET-2597OpenTypeInfoCacheProcessor.UpdateFontsCacheFromFolders throws exception and breaks the work if there are zero files in Fonts directoryEnhancement
IMAGINGNET-2596Improve memory usage of Jpeg fomat through improving work with bufferEnhancement
IMAGINGNET-2568Image exception on load Tiff imageEnhancement
IMAGINGNET-2552TypeTool6ResourceProcessor.ReplaceTextInGlobalResources does not workEnhancement
IMAGINGNET-2551Incorrect number conversion in OpenDocument support class: OdEnhancedGeometryReader.ReadEndEnhancement
IMAGINGNET-2545GIF image is not properly converted to PNGEnhancement
IMAGINGNET-2527Corrupted DngImage.Width and DngImage.Height after calling the Image.GetPixel methodEnhancement
IMAGINGNET-2519Improve Djvu performanceEnhancement
IMAGINGNET-2216Incorrect condition statement in DgImage.UnpackEnhancement
IMAGINGNET-2215Incorrect condition statement in DgImage.RawProcessEnhancement
IMAGINGNET-2007EMF image export errorEnhancement

Public API changes:

Added APIs:

Class Aspose.Imaging.ImageLoadOptions.DngLoadOptions

Class Aspose.Imaging.ImageLoadOptions.NoiseReductionType

Field/Enum Aspose.Imaging.FileFormats.Tiff.Enums.TiffExpectedFormat.TiffLzwCmyk

Field/Enum Aspose.Imaging.ImageLoadOptions.NoiseReductionType.Full

Field/Enum Aspose.Imaging.ImageLoadOptions.NoiseReductionType.Light

Field/Enum Aspose.Imaging.ImageLoadOptions.NoiseReductionType.None

Method Aspose.Imaging.FileFormats.Djvu.DjvuPage.GetBackgroundImage

Method Aspose.Imaging.ImageLoadOptions.DngLoadOptions.#ctor

Property Aspose.Imaging.ImageLoadOptions.DngLoadOptions.Fbdd

Removed APIs:

Method Aspose.Imaging.FileFormats.Djvu.DjvuPage.GetBackgroundImage(System.Int32)

Usage examples:

IMAGINGNET-2636 Darker colors and color reproducibility [.Net]

 public void TestMethod()

{

string path = @"TestFiles\";

// Load Tiff image with embedded Icc

{

string embeddedIccProfileTiff = path + "Cmyk-CmykProfile.tif";

using (TiffImage image = (TiffImage)Image.Load(embeddedIccProfileTiff))

{

// get icc by property

MemoryStream profileStream = image.ActiveFrame.FrameOptions.IccProfile;

AssertProfile(profileStream);

// or get icc by tag

TiffDataType tag = image.ActiveFrame.FrameOptions.GetTagByType(TiffTags.IccProfile);

profileStream = new MemoryStream(tag.Value as byte[]);

AssertProfile(profileStream);

}

}

// Load Psd image with embedded Icc

{

string embeddedIccProfilePsd = path + "NavyExchangeCmyk.psd";

using (PsdImage image = (PsdImage)Image.Load(embeddedIccProfilePsd))

{

MemoryStream profileStream = image.CmykColorProfile.Stream as MemoryStream;

AssertProfile(profileStream);

}

}

// Convert Psd image with embedded Cmyk Icc to Tiff with embedded Cmyk Icc

{

string embeddedIccProfilePsd = path + "NavyExchangeCmyk.psd";

MemoryStream sourceIcc;

using (PsdImage image = (PsdImage)Image.Load(embeddedIccProfilePsd))

{

sourceIcc = image.CmykColorProfile.Stream as MemoryStream;

TiffOptions options = new TiffOptions(TiffExpectedFormat.TiffLzwCmyk) { IccProfile = sourceIcc };

image.Save(embeddedIccProfilePsd + "_output.tiff", options);

}

// verify saved profile

using (TiffImage image = (TiffImage)Image.Load(embeddedIccProfilePsd + "_output.tiff"))

{

MemoryStream profileStream = image.ActiveFrame.FrameOptions.IccProfile;

AssertProfile(profileStream);

Assert.IsTrue(Compare(profileStream.ToArray(), sourceIcc.ToArray()));

}

}

}

private void AssertProfile(MemoryStream profileStream)

{

Assert.IsNotNull(profileStream);

}

private bool Compare(byte[] data1, byte[] data2)

{

if (data1.Length != data2.Length)

{

return false;

}

for (int i = 0; i < data2.Length; i++)

{

if (data1[i] != data2[i])

{

return false;

}

}

return true;

}

IMAGINGNET-2572 Support for converting CMYK PSD to CMYK Tiff

Add to test project method:

 private void PsdToTiffCmyk(string folder, bool isIccProfile)

{

string fileName = string.Format("cmyk_{0}.tiff", isIccProfile);

string inputFile = Path.Combine(folder,"cmyk.psd");

string inputIccFile = Path.Combine(folder,"JapanWebCoated.icc");

string outputFile = Path.Combine(folder,fileName);

using (Image image = Image.Load(inputFile))

{

if (isIccProfile)

{

using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(inputIccFile)))

{

image.Save(outputFile, new TiffOptions(TiffExpectedFormat.TiffLzwCmyk) { IccProfile = ms });

}

}

else

{

image.Save(outputFile, new TiffOptions(TiffExpectedFormat.TiffLzwCmyk));

}

}

}

execute following code:

 string folder = @"D:\tiff\";

//With IccProfile

this.PsdToTiffCmyk(folder,true);

//Without IccProfile

this.PsdToTiffCmyk(folder, false);

IMAGINGNET-2620 When PSD is converted to PNG, an ArgumentOutOfRangeException occurs [.Net]

 using (PsdImage input = (PsdImage)Image.Load("Cloud_AzPlat_Banner3A_SB_EN_US_160x600.psd"))

{

TextLayer textLayer;

foreach (Layer layer in input.Layers)

{

textLayer = layer as TextLayer;

if (textLayer != null)

{

textLayer.UpdateText("123\u0003abc");

}

}

input.Save("Cloud_AzPlat_Banner3A_SB_EN_US_160x600_updated.psd", new PsdOptions() { CompressionMethod = CompressionMethod.RLE });

}

using (PsdImage input = (PsdImage)Image.Load("Cloud_AzPlat_Banner3A_SB_EN_US_160x600_updated.psd"))

{

input.Save("Cloud_AzPlat_Banner3A_SB_EN_US_160x600_updated.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });

}

IMAGINGNET-2619 Gif not properly converted to png

 string file = @"6.gif";

using (Image image = Image.Load(file))

{

image.Save(file + ".png", new PngOptions());

}

IMAGINGNET-2618 Exception on saving Tiff Image

 string sourceFilePath = "Carelogic-1-11082017-3016-CH.tif";

string outputFilePath = "Carelogic-1-11082017-3016-CH Out.tif";

int resolution = 96;

using (RasterImage image = (RasterImage)Image.Load(sourceFilePath))

{

TiffOptions saveOptions = new TiffOptions(TiffExpectedFormat.Default);

saveOptions.ResolutionSettings = new ResolutionSetting(resolution, resolution);

saveOptions.Compression = TiffCompressions.None;

saveOptions.BitsPerSample = new ushort[] { 1 };

int width = image.Width * resolution / (int)image.HorizontalResolution;

int height = image.Height * resolution / (int)image.VerticalResolution;

image.Resize(width, height); // No more exception here!

image.Save(outputFilePath, saveOptions);

}

IMAGINGNET-2617 Fix PSD test rendering for specific case

 using (PsdImage image = Image.Load("1.psd") as PsdImage)

{

image.Save("1.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });

}

IMAGINGNET-2614 Fix PSD crop operation

 PsdLoadOptions psdLoadOptions = new PsdLoadOptions();

psdLoadOptions.LoadEffectsResource = true;

using (PsdImage image = (PsdImage)Image.Load("MSFT_DevEva_Web_Twitter-800x320_2-DVG.PSD", psdLoadOptions))

{

Rectangle rect = new Rectangle(10, 30, 100, 100);

image.Crop(rect);

image.Save("MSFT_DevEva_Web_Twitter-800x320_2-DVG_new_ethalon.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });

}

IMAGINGNET-2612 Exception on converting emf to svg

 string file = @"powerpoint_emf.emf";

using (Image image = Image.Load(file))

{

EmfRasterizationOptions rasterizationOptions = new EmfRasterizationOptions();

rasterizationOptions.PageWidth = image.Width;

rasterizationOptions.PageHeight = image.Height;

image.Save(file + ".png", new PngOptions() { VectorRasterizationOptions = rasterizationOptions });

image.Save(file + ".svg", new SvgOptions() { VectorRasterizationOptions = rasterizationOptions });

}

IMAGINGNET-2610 Image saving failed when saving JPEG2000 as PNG

 string inputImage = @"D:\input.jp2";

string outputImage = @"D:\input.png";

using (Image image = Image.Load(inputImage))

{

image.Save(outputImage, new PngOptions());

}

IMAGINGNET-2596 Improve memory usage of Jpeg fomat through improving work with buffer

Test filemaster_uatnew resultImproved
big_fruit_noprogressive.jpg00:06:14.394247900:05:51.99441426%
big_fruit_progressive.jpg00:05:11.462732700:04:49.74259877%
As well, 6-7% improved heap allocation.

IMAGINGNET-2568 Image exception on load Tiff image

 string inputFileName = @"D:\posterUfficio_crop.tif";

string outFileName = @"D:\posterUfficio_crop.png";

using (Image image = Image.Load(inputFileName))

{

image.Save(outFileName, new PngOptions());

}

IMAGINGNET-2552 TypeTool6ResourceProcessor.ReplaceTextInGlobalResources does not work. Fix is related to saving PSD metadata after text update (part of it was just not saved), which can be checked by working with updated PSD file directly from Photoshop. If export to other format was the case for you, just don’t bother with it.

IMAGINGNET-2551 Incorrect number conversion in OpenDocument support class: OdEnhancedGeometryReader.ReadEnd.

 string inputFileName = @"D:\Odg\modifiersTest.odg";

string outputFileName = @"D:\Odg\modifiersTest.pdf";

ImageOptionsBase options = new PdfOptions();

System.Globalization.CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;

System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)culture.Clone();

customCulture.NumberFormat.NumberDecimalSeparator = ",";

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

try

{

using (OdgImage image = (OdgImage) Image.Load(inputFileName))

{

this.ExportImage(image.Pages[0], outputFileName, options);

}

}

finally

{

System.Threading.Thread.CurrentThread.CurrentCulture = culture;

}

private void ExportImage(Image image, string fileName, ImageOptionsBase options)

{

options.VectorRasterizationOptions = new MetafileRasterizationOptions

{

PageWidth = image.Width,

PageHeight = image.Height

};

image.Save(fileName, options);

}

IMAGINGNET-2545 Gif image is not properly converted to Png

 string path = @"transbugs.gif";

using (Image m_oDocument = Image.Load(path))

{

int m_iResolution = 98;

Aspose.Imaging.ImageOptions.PngOptions OptionsIM = new Aspose.Imaging.ImageOptions.PngOptions();

OptionsIM.ColorType = Aspose.Imaging.FileFormats.Png.PngColorType.TruecolorWithAlpha;

Aspose.Imaging.ResolutionSetting oResIM = new Aspose.Imaging.ResolutionSetting(Convert.ToDouble(m_iResolution), Convert.ToDouble(m_iResolution));

OptionsIM.ResolutionSettings = oResIM;

((Aspose.Imaging.Image)m_oDocument).Save(path + ".png", OptionsIM);

}

IMAGINGNET-2527 Corrupted DngImage.Width and DngImage.Height after calling the Image.GetPixel method.

 int expectedWidth;

int expectedHeight;

string inputFilename = @"D:\berries-raw.dng";

string outFileName = @"D:\result.tiff";

using (DngImage image = (DngImage) Image.Load(inputFilename))

{

expectedWidth = image.Width;

expectedHeight = image.Height;

Color c = image.GetPixel(3303, 1787);

Console.WriteLine(c);

if (expectedWidth != image.Width)

{

throw new Exception(string.Format("Current file: Expected width = {0}, Actual width = {1}", expectedWidth, image.Width));

}

if (expectedHeight != image.Height)

{

throw new Exception(string.Format("Current file: Expected height = {0}, Actual height = {1}", expectedHeight, image.Height));

}

image.Save(

outFileName,

new TiffOptions(TiffExpectedFormat.TiffNoCompressionRgb));

}

using (Image image = Image.Load(outFileName))

{

if (expectedWidth != image.Width)

{

throw new Exception(string.Format("Result file: Expected width = {0}, Actual width = {1}", expectedWidth, image.Width));

}

if (expectedHeight != image.Height)

{

throw new Exception(string.Format("Result file: Expected height = {0}, Actual height = {1}", expectedHeight, image.Height));

}

}

IMAGINGNET-2519 Improve Djvu performance

Execute the following code with current library and library - 17.11.Imaging.29.11.2017. Time of execution in the current library is less by 20% than in library - 17.11.Imaging.29.11.2017.

 string fileName = @"D:\superhero.djvu";

string outputFile = @"D:\result.tiff";

using (DjvuImage image = (DjvuImage) Image.Load(fileName))

using (TiffOptions exportOptions = new TiffOptions(TiffExpectedFormat.Default))

{

exportOptions.MultiPageOptions = new DjvuMultiPageOptions(new IntRange(0, 10));

image.Save(outputFile, exportOptions);

}

Current configuration:

Configurationtime in Current libtime in 17.11.Imaging.29.11.2017
Core i7 8GB Win 10 x64 Vs 2015 debug19.1s23.4s
IMAGINGNET-2215 Incorrect condition statement in DgImage.RawProcess
input file: Phantom1.dng
output file: phantom1.png
 string inputFileName = @"D:\Phantom1.dng";

string outFileName = @"D:\Phantom1.png";

using (Image image = Image.Load(inputFileName, new DngLoadOptions() { Fbdd = NoiseReductionType.Full }))

{

image.Save(outFileName, new PngOptions());

}

IMAGINGNET-2007 Emf image export error

 string filePath = "Picture1.emf";

using (Image mf = Image.Load(filePath))

{

EmfRasterizationOptions emfRasterizationOptions = new EmfRasterizationOptions();

emfRasterizationOptions.BackgroundColor = (Color.Gray);

PngOptions pngOptions = new PngOptions();

pngOptions.VectorRasterizationOptions = emfRasterizationOptions;

emfRasterizationOptions.PageWidth = mf.Width;

emfRasterizationOptions.PageHeight = mf.Height;

mf.Save(filePath + "_IMAGINGNET-2007.png", pngOptions);

emfRasterizationOptions.PageWidth = 100;

emfRasterizationOptions.PageHeight = 100;

mf.Save(filePath + "_IMAGINGNET-2007_small.png", pngOptions);

}