Обработка на JPEG изображения
Използване на класа ExifData за четене и промяна на Jpeg EXIF тагове
Почти всички цифрови камери (включително смартфони), скенери и други системи, които обработват изображения, запазват изображения с информация EXIF (Exchangeable Image File). Камерите записват настройките и информацията за сцената в изображението. Информацията EXIF включва също скорост на затвора, дата и час на снимката, фокусно разстояние, корекция на експонацията, зоната за измерване и дали е бил използван светкавицата. Aspose.Imaging APIs позволяват извличането на информацията EXIF от дадено изображение по много лесен и прост начин. Разработчиците могат също така да пишат данни EXIF към изображенията или да променят съществуващата информация според своите изисквания. Aspose.PSD предлага класа ExifData за четене, писане и промяна на данните EXIF, докато пространството имена Aspose.PSD.Exif.Enums съдържа съответните изброителни типове, използвани в процеса.
Четене на данните EXIF
Aspose.PSD APIs предоставят възможност за четене на данни EXIF от дадено изображение. Предоставените по-долу стъпки илюстрират използването на класа ExifData за четене на информацията EXIF от изображение.
- Зареждане на PSD изображението чрез метода фабрика Load.
- Намиране на Jpeg миниатюра сред ресурсите на PSD.
- Извличане на екземпляр на класа ExifData.
Извличане на необходимата информация и записване на конзолата.
Освен това, разработчиците също могат да получат определена информация, използвайки следния откъс код.
Писане и промяна на данни EXIF
Използвайки Aspose.PSD APIs, разработчиците могат да пишат нова информация EXIF и да променят съществуващите данни EXIF на изображение. И двете процеса (Писане и Промяна) изискват зареждане на изображение и взимане на данните EXIF в екземпляр на класа ExifData. След това може да се достъпят свойствата, изложени от класа ExifData, за да се зададат съответно. Моля, обърнете внимание, че изображенията за манипулация трябва да бъдат Jpeg или Tiff изображения, които обикновено са миниатюрите на 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 + "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"); | |
} |
Извличане на миниатюри от ресурсите на PSD
Миниатюрите са намалени версии на изображения, използвани за показване на значима част от изображението вместо пълния кадър. Някои изображения (особено тези, заснети с цифрова камера) включват миниатюрно изображение, вградено във файл. Aspose.PSD API позволява извличането на миниатюри от ресурсите на PSD и запазването им поотделно на диск. Ресурсите за миниатюри включват свойство ExifData.Thumbnail, което може да извлече данните за миниатюрата. Долният примерен код показва как да се използва това.
// 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()); | |
} | |
} | |
} | |
} |
Използвайте посочения по-горе подход, за да запазите миниатюрата в други поддържани формати за файлове. Ако желаете да експортирате данните за миниатюрата към други формати за изображения, като BMP и PNG, моля, използвайте други опции за експорт на изображения.
Извличане на миниатюри от сегментите JFIF
Също така е възможно да извлечете миниатюри от сегментите ExifData или JFIF на ресурсите за миниатюри на PSD. Следният код показва как да извършите извличането на данни за миниатюри от сегмента JFIF или ExifData:
// 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()); | |
} | |
} | |
} | |
} |
Използвайте посочения по-горе подход, за да запазите миниатюрата в други поддържани формати за файлове. Ако желаете да експортирате данните за миниатюрата към други формати за изображения, като BMP и PNG, моля, използвайте други опции за експорт на изображения.
Добавяне на миниатюра към сегмента JFIF
Долният откъс код показва как да се използва свойството JFIF. Thumbnail, за да се добави миниатюрно изображение към JFIF сегмента на заредено 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(); | |
} |
Миниатюрните изображения с други данни от сегмента не могат да бъдат повече от 65,545 байта поради спецификациите на формата JPEG. В случай, че се опитвате да зададете големи изображение като миниатюра, може да възникне изключение.
Добавяне на миниатюра към сегмента EXIF
Долният откъс код показва как да се използва свойството ExifData.Thumbnail, за да се добави миниатюрно изображение към сегмента EXIF на заредено 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(); | |
} |
В този случай, Aspose.PSD API не може да оцени размера на миниатюрното изображение, но може да провери размера на целия сегмент с данни за EXIF. Този размер не може да бъде по-голям от 65,535 байта.
Използване на класа JpegExifData за четене и промяна на Jpeg EXIF тагове
Aspose.PSD APIs предлагат класа JpegExifData, който е ексклузивен за Jpeg изображенията, за извличане и актуализация на информацията EXIF. Този членеклас JpegExifData на Aspose.PSD.Exif.JpegExifData служи като контейнер за данните EXIF за Jpeg изображения и предоставя възможност за извличане на стандартните Jpeg EXIF тагове, както е показано по-долу:
// 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(); | |
} |
Пълен списък на EXIF таговете
Горният откъс код чете няколко EXIF тага, използвайки свойствата, предлагани от класа Aspose.PSD.Exif.JpegExifData. Пълният списък с тези свойства е наличен тук. Следващият код ще прочете всички EXIF тагове, използвайки класа 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)); | |
} | |
} | |
} | |
} | |
} |
Автоматично коригиране на ориентацията на JPEG изображенията
Снимките могат да бъдат направени с камера, завъртяна на 90°, 180°, 270° или няма завъртане (нормална ориентация). Повечето цифрови фотоапарати запазват информацията за ориентацията заедно с изображението като етикети EXIF на JPEG изображенията. Тази информация може да се използва за автоматично завъртане на изображенията, за да се коригира ориентацията. Aspose.PSD APIs предлагат метода AutoRotate за класа JpegImage за автоматичното коригиране на ориентацията на JPEG изображенията. Ето как можете да използвате метода AutoRotate с Aspose.PSD за .NET API.
Поддръжка за JPEG-LS с CMYK и YCCK
Aspose.PSD за .NET API предоставя поддръжка за модели на цветове CMYK и YCCK с JPEG-LS. Долният откъс код демонстрира как да се използва тази поддръжка за JPEG-LS.
// 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); | |
} |
Поддръжка за 2-7 бита за изображение в JPEG-LS изображения
Aspose.PSD за .NET API предоставя поддръжка за 2-7 бита за изображение в JPEG-LS изображения. Долният откъс код демонстрира как да се използва тази поддръжка за JPEG-LS.
Задаване на ColorType и CompressionType за JPEG изображения
Aspose.PSD за .NET API предоставя поддръжка за Color Type и Compression Type и ги задава като градации на сиво и прогресивно за JPEG изображения. Долният откъс код демонстрира как да се използва тази поддръжка.
// 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); | |
} |
Долният откъс код демонстрира как да се използва свойството ExifData.Thumbnail, за да се добави миниатюрно изображение към сегмента EXIF на заредено 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(); | |
} |
В този случай, Aspose.PSD API не може да оцени размера на миниатюрното изображение, но може да провери размера на целия сегмент с данни за EXIF. Този размер не може да бъде по-голям от 65,535 байта.