Manipulace s obrázky ve formátu JPEG

Použití třídy ExifData k čtení a úpravám EXIF značek ve formátu JPEG

Téměř všechny digitální fotoaparáty (včetně chytrých telefonů), skenery a další systémy pracující s obrazem ukládají obrázky s EXIF (Exchangeable Image File) informacemi. Fotoaparát do souboru obrazu zaznamenává nastavení fotoaparátu a informace o scéně. EXIF data zahrnují také čas závěrky, datum a čas pořízení fotografie, ohniskovou vzdálenost, kompenzaci expozice, vzorek metrující oblasti a informaci o použití blesku. API služby Aspose.Imaging umožňuje extrahovat EXIF informace z daného obrázku velmi snadným a jednoduchým způsobem. Vývojáři mohou také zapisovat EXIF data do obrázků nebo upravovat existující informace podle svých potřeb. Aspose.PSD poskytuje třídu ExifData pro čtení, zápis a úpravy EXIF dat, zatímco jmenný prostor Aspose.PSD.Exif.Enums obsahuje relevantní enumerace používané v procesu.

Čtení EXIF dat

Aspose.PSD API poskytuje prostředky pro čtení EXIF dat z daného obrázku. Níže uvedené kroky ilustrují použití třídy ExifData k čtení EXIF informací z obrázku.

  • Načtěte obraz PSD pomocí tovární metody Load.
  • Najděte miniaturu JPEG mezi zdroji PSD.
  • Extrahujte instanci třídy ExifData.

Získejte požadované informace a zapište je do konzole.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "1280px-Zebras_Serengeti.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract exif data and print to the console.
var exif = ((ThumbnailResource)resource).JpegOptions.ExifData;
if (exif != null)
{
Type type = exif.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name + ":" + property.GetValue(exif, null));
}
}
}
}
}

Alternativně mohou vývojáři získat konkrétní informace pomocí následující části kódu.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "1280px-Zebras_Serengeti.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract exif data and print to the console.
var exif = ((ThumbnailResource)resource).JpegOptions.ExifData;
if (exif != null)
{
Console.WriteLine("Exif WhiteBalance: " + exif.WhiteBalance);
Console.WriteLine("Exif PixelXDimension: " + exif.PixelXDimension);
Console.WriteLine("Exif PixelYDimension: " + exif.PixelYDimension);
Console.WriteLine("Exif ISOSpeed: " + exif.ISOSpeed);
Console.WriteLine("Exif FocalLength: " + exif.FocalLength);
}
}
}
}

Zápis a úpravy EXIF dat

Pomocí API Aspose.PSD mohou vývojáři zapisovat nové EXIF informace a upravovat existující EXIF data obrázku. Oba procesy (Zápis a Úprava) vyžadují načtení obrazu a získání EXIF dat do instance třídy ExifData. Poté můžete přistupovat k vlastnostem vystaveným třídou ExifData a nastavit je podle potřeby. Pamatujte, že obrázky pro úpravy by měly být v formátu Jpeg nebo Tiff, které jsou obvykle miniaturami PSD. Ukázkový kód pro demonstrování použití je následující:

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "sample.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract exif data and print to the console.
var exif = ((ThumbnailResource)resource).JpegOptions.ExifData;
if (exif != null)
{
// Set LensMake, WhiteBalance, Flash information Save the image
exif.LensMake = "Sony";
exif.WhiteBalance = ExifWhiteBalance.Auto;
exif.Flash = ExifFlash.Fired;
}
}
}
image.Save(dataDir + "aspose_out.psd");
}

Extrakce miniatur z prostředků PSD

Miniatury jsou zmenšené verze obrázků, které slouží k zobrazení významné části obrázku namísto celého rámce. Některé obrazové soubory (zejména ty pořízené digitálními fotoaparáty) obsahují vložený miniatury obrázku v souboru. API Aspose.PSD vám umožňuje extrahovat miniatury prostředků PSD a uložit je samostatně na disk. Prostředky miniatur obsahují vlastnost ExifData.Thumbnail, která může získat data miniatury. Následující kódová ukázka demonstruje, jak ji používat.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "1280px-Zebras_Serengeti.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract thumbnail data and store it as a separate image file.
var thumbnail = (ThumbnailResource)resource;
var data = ((ThumbnailResource)resource).ThumbnailArgb32Data;
using (PsdImage extractedThumnailImage = new PsdImage(thumbnail.Width, thumbnail.Height))
{
extractedThumnailImage.SaveArgb32Pixels(extractedThumnailImage.Bounds, data);
extractedThumnailImage.Save(dataDir + "extracted_thumbnail.jpg", new JpegOptions());
}
}
}
}

Použijte výše popsaný postup k uložení miniatury do jiných podporovaných formátů souborů. Pokud chcete exportovat data miniatury do jiných obrázkových formátů, jako jsou BMP a PNG, použijte jiné možnosti exportu obrázků.

Extrakce miniatur z segmentů JFIF

Je také možné extrahovat miniatury z JFIF segmentů nebo ExifData segmentů prostředků miniatur PSD. Následující kód ukazuje, jak provést extrakci dat miniatury z JFIF nebo ExifData segmentu:

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "1280px-Zebras_Serengeti.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract thumbnail data and store it as a separate image file.
var thumbnail = (ThumbnailResource)resource;
var data = ((ThumbnailResource)resource).ThumbnailArgb32Data;
using (PsdImage extractedThumnailImage = new PsdImage(thumbnail.Width, thumbnail.Height))
{
extractedThumnailImage.SaveArgb32Pixels(extractedThumnailImage.Bounds, data);
extractedThumnailImage.Save(dataDir + "extracted_thumbnail.jpg", new JpegOptions());
}
}
}
}

Použijte výše popsaný postup k uložení miniatury do jiných podporovaných formátů souborů. Pokud chcete exportovat data miniatury do jiných obrázkových formátů, jako jsou BMP a PNG, použijte jiné možnosti exportu obrázků.

Přidání miniatury do segmentu JFIF

Následující kódová ukázka ukazuje, jak použít vlastnost JFIF.Thumbnail k přidání miniatury do segmentu JFIF načteného obrazu PSD.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "aspose_out.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Adjust thumbnail data.
var thumbnail = (ThumbnailResource)resource;
var jfifData = new FileFormats.Jpeg.JFIFData();
var thumbnailImage = new PsdImage(100, 100);
try
{
// Fill thumbnail data.
int[] pixels = new int[thumbnailImage.Width * thumbnailImage.Height];
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = i;
}
// Assign thumbnail data.
thumbnailImage.SaveArgb32Pixels(thumbnailImage.Bounds, pixels);
jfifData.Thumbnail = thumbnailImage;
jfifData.XDensity = 1;
jfifData.YDensity = 1;
thumbnail.JpegOptions.Jfif = jfifData;
}
catch
{
thumbnailImage.Dispose();
throw;
}
}
}
image.Save();
}

Obrázky miniatur s jinými daty segmentu nesmí obsahovat více než 65 545 bytů kvůli specifikacím formátu JPEG. V případě, že budou odeslány velké obrázky jako miniatury, může nastat výjimka.

Přidání miniatury do segmentu EXIF

Následující kódová ukázka ukazuje, jak použít vlastnost ExifData.Thumbnail k přidání miniatury do segmentu EXIF načteného obrazu PSD.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "aspose_out.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Adjust thumbnail data.
var thumbnail = (ThumbnailResource)resource;
var exifData = new JpegExifData();
var thumbnailImage = new PsdImage(100, 100);
try
{
// Fill thumbnail data.
int[] pixels = new int[thumbnailImage.Width * thumbnailImage.Height];
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = i;
}
// Assign thumbnail data.
thumbnailImage.SaveArgb32Pixels(thumbnailImage.Bounds, pixels);
exifData.Thumbnail = thumbnailImage;
thumbnail.JpegOptions.ExifData = exifData;
}
catch
{
thumbnailImage.Dispose();
throw;
}
}
}
image.Save();
}

V tomto případě API Aspose.PSD nemůže odhadnout velikost miniatury, ale může zkontrolovat velikost celého segmentu EXIF dat. Tato velikost nemůže být větší než 65 535 bytů.

Použití třídy JpegExifData k čtení a úpravám EXIF značek ve formátech Jpeg

API Aspose.PSD poskytuje tříduJpegExifData, která je výlučná pro formáty obrázků Jpeg k získání a aktualizaci EXIF informací. Tento článek demonstruje použití třídy JpegExifData k dosažení toho samého. Třída Aspose.PSD.Exif.JpegExifData slouží jako kontejner EXIF dat pro obrázky Jpeg a poskytuje prostředky k získání standardních EXIF značek Jpeg, jak je ukázáno níže:

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "aspose_out.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Adjust thumbnail data.
var thumbnail = (ThumbnailResource)resource;
var exifData = new JpegExifData();
var thumbnailImage = new PsdImage(100, 100);
try
{
// Fill thumbnail data.
int[] pixels = new int[thumbnailImage.Width * thumbnailImage.Height];
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = i;
}
// Assign thumbnail data.
thumbnailImage.SaveArgb32Pixels(thumbnailImage.Bounds, pixels);
exifData.Thumbnail = thumbnailImage;
thumbnail.JpegOptions.ExifData = exifData;
}
catch
{
thumbnailImage.Dispose();
throw;
}
}
}
image.Save();
}

Kompletní seznam EXIF značek

Výše uvedená část kódu čte několik EXIF značek pomocí vlastností nabízených třídou Aspose.PSD.Exif.JpegExifData. Kompletní seznam těchto vlastností je k dispozici zde. Následující kód přečte všechny EXIF značky pomocí třídy System.Reflection.PropertyInfo.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
using (PsdImage image = (PsdImage)Image.Load(dataDir + "1280px-Zebras_Serengeti.psd"))
{
// Iterate over resources.
foreach (var resource in image.ImageResources)
{
// Find thumbnail resource. Typically they are in the Jpeg file format.
if (resource is ThumbnailResource || resource is Thumbnail4Resource)
{
// Extract thumbnail data and store it as a separate image file.
var thumbnail = (ThumbnailResource)resource;
var exifData = thumbnail.JpegOptions.ExifData;
if (exifData != null)
{
Type type = exifData.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name + ":" + property.GetValue(exifData, null));
}
}
}
}
}

Automatická korekce orientace obrázků ve formátu JPEG

Fotografie mohou být pořízeny fotoaparátem otočeným o 90°, 180°, 270° nebo žádným způsobem (normální orientace). Většina digitálních fotoaparátů ukládá informace o orientaci spolu s obrazovými daty jako EXIF značkami obrázků ve formátu JPEG. Tyto informace lze použít k automatickému otočení obrázků a k opravě orientace. API Aspose.PSD poskytuje metodu AutoRotate pro třídu JpegImage k automatické korekci orientace obrázků ve formátu JPEG. Zde je, jak můžete použít metodu AutoRotate s API Aspose.PSD pro .NET.

Podpora pro JPEG-LS s CMYK a YCCK

API Aspose.PSD pro .NET poskytuje podporu pro barevné modely CMYK a YCCK s formátem JPEG-LS. Následující část kódu demonstruje, jak tuto podporu pro JPEG-LS použít.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "PsdImage.psd"))
{
JpegOptions options = new JpegOptions();
//Just replace one line given below in examples to use YCCK instead of CMYK
//options.ColorType = JpegCompressionColorMode.Cmyk;
options.ColorType = JpegCompressionColorMode.Cmyk;
options.CompressionType = JpegCompressionMode.JpegLs;
// The default profiles will be used.
options.RgbColorProfile = null;
options.CmykColorProfile = null;
image.Save(dataDir + "output.jpg", options);
}
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "PsdImage.psd"))
{
JpegOptions options = new JpegOptions();
//Just replace one line given below in examples to use YCCK instead of CMYK
//options.ColorType = JpegCompressionColorMode.Cmyk;
options.ColorType = JpegCompressionColorMode.Cmyk;
options.CompressionType = JpegCompressionMode.Lossless;
// The default profiles will be used.
options.RgbColorProfile = null;
options.CmykColorProfile = null;
image.Save(dataDir + "output2.jpg", options);
}

Podpora pro 2-7 bitů na vzorek v obrazech JPEG-LS

API Aspose.PSD pro .NET poskytuje podporu pro obrázky JPEG-LS s 2 až 7 bity na vzorek. Následující část kódu demonstruje, jak tuto podporu pro JPEG-LS použít.

Nastavení ColorType a CompressionType pro obrázky ve formátu JPEG

API Aspose.PSD pro .NET poskytuje podporu pro typ barvy a typ komprese a nastavuje je jako stupně šedi a postupný pro obrázky ve formátu JPEG. Následující část kódu demonstruje, jak tuto podporu použít.

// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET
// Load PSD image.
using (PsdImage image = (PsdImage)Image.Load(dataDir + "PsdImage.psd"))
{
JpegOptions options = new JpegOptions();
options.ColorType = JpegCompressionColorMode.Grayscale;
options.CompressionType = JpegCompressionMode.Progressive;
image.Save(dataDir + "ColorTypeAndCompressionType_output.jpg", options);
}

Následující část kódu ukazuje, jak použít vlastnost ExifData.Thumbnail k přidání miniatury do segmentu EXIF načteného obrázku PSD.

V tomto případě API Aspose.PSD nemůže odhadnout velikost miniatury, ale může zkontrolovat velikost celého segmentu EXIF dat. Tato velikost nemůže být větší než 65 535 bytů.