Memanipulasi Gambar JPEG
Menggunakan Kelas ExifData untuk Membaca dan Memodifikasi Tag EXIF JPEG
Hampir semua kamera digital (termasuk ponsel pintar), pemindai, dan sistem lain yang menangani gambar menyimpan gambar dengan informasi EXIF (Exchangeable Image File). Pengaturan kamera dan informasi adegan direkam oleh kamera ke dalam file gambar. Data EXIF juga mencakup kecepatan rana, tanggal dan waktu pengambilan foto, panjang fokus, kompensasi paparan, pola pengukuran, dan apakah flash digunakan. API Aspose.Imaging telah memungkinkan untuk mengekstrak informasi EXIF dari gambar yang diberikan dengan cara yang sangat mudah dan sederhana. Pengembang juga dapat menulis data EXIF ke gambar atau memodifikasi informasi yang ada sesuai dengan kebutuhan mereka. Aspose.Imaging telah menyediakan kelas ExifData untuk membaca, menulis, dan memodifikasi data EXIF, di mana namespace Aspose.PSD.Exif.Enums berisi enumerasi yang relevan yang digunakan dalam proses.
Membaca Data EXIF
API Aspose.PSD menyediakan cara untuk membaca data EXIF dari gambar yang diberikan. Langkah-langkah yang disediakan di bawah ini mengilustrasikan penggunaan kelas ExifData untuk membaca informasi EXIF dari sebuah gambar.
- Memuat Gambar PSD menggunakan metode pabrik Load.
- Temukan gambar miniatur JPEG di antara sumber daya PSD.
- Ekstrak sebuah instansi kelas ExifData.
Dapatkan informasi yang diperlukan dan tulis ke konsol.
Alternatifnya, pengembang juga dapat mengambil informasi khusus menggunakan potongan kode berikut.
Menulis dan Memodifikasi Data EXIF
Dengan menggunakan API Aspose.PSD, pengembang dapat menulis informasi EXIF baru dan memodifikasi data EXIF yang ada dari sebuah gambar. Kedua proses (Menulis & Memodifikasi) memerlukan memuat gambar dan mendapatkan data EXIF ke dalam sebuah instansi kelas ExifData. Kemudian, seseorang dapat mengakses properti yang diekspos oleh kelas ExifData untuk mengaturnya secara sesuai. Harap dicatat bahwa gambar untuk dimanipulasi harus berupa gambar JPEG atau TIFF yang biasanya adalah miniatur PSD. Kode sampel untuk mendemonstrasikan penggunaan adalah sebagai berikut:
String dataDir = Utils.getDataDir(WritingAndModifyingEXIFData.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Extract exif data and print to the console. | |
JpegExifData exif = ((ThumbnailResource) image.getImageResources()[i]).getJpegOptions().getExifData(); | |
if (exif != null) { | |
// Set LensMake, WhiteBalance, Flash information Save the image | |
exif.setLensMake("Sony"); | |
exif.setWhiteBalance(ExifWhiteBalance.Auto); | |
exif.setFlash(ExifFlash.Fired); | |
} | |
} | |
} | |
image.save(dataDir + "aspose_out.psd"); | |
} |
Mengekstrak Thumbnail dari Sumber Daya PSD
Thumbnail adalah versi berukuran lebih kecil dari gambar, digunakan untuk menampilkan bagian penting dari gambar daripada bingkai penuh. Beberapa file gambar (terutama yang diambil dengan kamera digital) memiliki gambar miniatur tertanam di dalam file. API Aspose.PSD memungkinkan Anda untuk mengekstrak miniatur sumber daya PSD dan menyimpannya terpisah di disk. Sumber daya thumbnail berisi properti ExifData.Thumbnail yang dapat mengambil data thumbnail. Potongan kode di bawah ini mendemonstrasikan cara menggunakannya.
String dataDir = Utils.getDataDir(ExtractThumbnailFromPSD.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Extract thumbnail data and store it as a separate image file. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
int[] data = ((ThumbnailResource) image.getImageResources()[i]).getThumbnailArgb32Data(); | |
try (PsdImage extractedThumnailImage = new PsdImage(thumbnail.getWidth(), thumbnail.getHeight())) { | |
extractedThumnailImage.saveArgb32Pixels(extractedThumnailImage.getBounds(), data); | |
extractedThumnailImage.save(dataDir + "extracted_thumbnail.jpg", new JpegOptions()); | |
} | |
} | |
} | |
} |
Gunakan pendekatan yang dibahas di atas untuk menyimpan thumbnail ke format file lain yang didukung. Jika Anda ingin mengekspor data thumbnail ke format gambar lain seperti BMP & PNG, harap gunakan opsi ekspor gambar lain.
Mengekstrak Thumbnail dari Segmen JFIF
Juga memungkinkan untuk mengekstrak thumbnail dari segmen ExifData atau JFIF dari sumber daya thumbnail PSD. Kode berikut menunjukkan bagaimana melakukan ekstraksi data thumbnail dari segmen JFIF atau ExifData:
String dataDir = Utils.getDataDir(ExtractThumbnailFromPSD.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Extract thumbnail data and store it as a separate image file. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
int[] data = ((ThumbnailResource) image.getImageResources()[i]).getThumbnailArgb32Data(); | |
try (PsdImage extractedThumnailImage = new PsdImage(thumbnail.getWidth(), thumbnail.getHeight())) { | |
extractedThumnailImage.saveArgb32Pixels(extractedThumnailImage.getBounds(), data); | |
extractedThumnailImage.save(dataDir + "extracted_thumbnail.jpg", new JpegOptions()); | |
} | |
} | |
} | |
} |
Gunakan pendekatan yang dibahas di atas untuk menyimpan thumbnail ke format file lain yang didukung. Jika Anda ingin mengekspor data thumbnail ke format gambar lain seperti BMP & PNG, harap gunakan opsi ekspor gambar lain.
Menambahkan Thumbnail ke Segmen JFIF
Potongan kode di bawah ini mendemonstrasikan cara menggunakan properti JFIF.Thumbnail untuk menambahkan gambar thumbnail ke segmen JFIF dari gambar PSD yang dimuat.
String dataDir = Utils.getDataDir(AddThumbnailToJFIFSegment.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Adjust thumbnail data. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
JpegExifData exifData = new JpegExifData(); | |
PsdImage thumbnailImage = new PsdImage(100, 100); | |
try { | |
// Fill thumbnail data. | |
int[] pixels = new int[thumbnailImage.getWidth() * thumbnailImage.getHeight()]; | |
for (int j = 0; j < pixels.length; j++) { | |
pixels[j] = j; | |
} | |
// Assign thumbnail data. | |
thumbnailImage.saveArgb32Pixels(thumbnailImage.getBounds(), pixels); | |
exifData.setThumbnail(thumbnailImage); | |
thumbnail.getJpegOptions().setExifData(exifData); | |
} catch (Exception e) { | |
thumbnailImage.dispose(); | |
} | |
} | |
} | |
image.save(); | |
} |
Gambar thumbnail dengan data segmen lain tidak dapat mencapai lebih dari 65.545 byte karena spesifikasi format JPEG. Dalam kasus di mana gambar besar akan diatur sebagai thumbnail, mungkin timbul pengecualian.
Menambahkan Thumbnail ke Segmen EXIF
Potongan kode di bawah ini menunjukkan cara menggunakan properti ExifData.Thumbnail untuk menambahkan gambar thumbnail ke segmen EXIF dari gambar PSD yang dimuat.
String dataDir = Utils.getDataDir(AddThumbnailToEXIFSegment.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Adjust thumbnail data. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
JpegExifData exifData = new JpegExifData(); | |
PsdImage thumbnailImage = new PsdImage(100, 100); | |
try { | |
// Fill thumbnail data. | |
int[] pixels = new int[thumbnailImage.getWidth() * thumbnailImage.getHeight()]; | |
for (int j = 0; j < pixels.length; j++) { | |
pixels[j] = j; | |
} | |
// Assign thumbnail data. | |
thumbnailImage.saveArgb32Pixels(thumbnailImage.getBounds(), pixels); | |
exifData.setThumbnail(thumbnailImage); | |
thumbnail.getJpegOptions().setExifData(exifData); | |
} catch (Exception e) { | |
thumbnailImage.dispose(); | |
} | |
} | |
} | |
image.save(); | |
} |
Dalam hal ini, API Aspose.PSD tidak dapat memperkirakan ukuran gambar thumbnail, tetapi dapat memeriksa ukuran seluruh segmen data EXIF. Ini tidak boleh lebih besar dari 65.535 byte.
Menggunakan Kelas JpegExifData untuk Membaca dan Memodifikasi Tag EXIF JPEG
API Aspose.PSD menyediakan kelas JpegExifData yang eksklusif untuk format gambar JPEG untuk mengambil & memperbarui informasi EXIF. Artikel ini mendemonstrasikan penggunaan kelas JpegExifData untuk mencapai hal yang sama. Kelas Aspose.PSD.Exif.JpegExifData berfungsi sebagai wadah data EXIF untuk gambar JPEG, dan menyediakan cara untuk mengambil tag EXIF JPEG standar seperti yang ditunjukkan di bawah ini:
String dataDir = Utils.getDataDir(AddThumbnailToEXIFSegment.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Adjust thumbnail data. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
JpegExifData exifData = new JpegExifData(); | |
PsdImage thumbnailImage = new PsdImage(100, 100); | |
try { | |
// Fill thumbnail data. | |
int[] pixels = new int[thumbnailImage.getWidth() * thumbnailImage.getHeight()]; | |
for (int j = 0; j < pixels.length; j++) { | |
pixels[j] = j; | |
} | |
// Assign thumbnail data. | |
thumbnailImage.saveArgb32Pixels(thumbnailImage.getBounds(), pixels); | |
exifData.setThumbnail(thumbnailImage); | |
thumbnail.getJpegOptions().setExifData(exifData); | |
} catch (Exception e) { | |
thumbnailImage.dispose(); | |
} | |
} | |
} | |
image.save(); | |
} |
Daftar Lengkap Tag EXIF
Potongan kode di atas membaca beberapa Tag EXIF menggunakan properti yang ditawarkan oleh kelas Aspose.PSD.Exif.JpegExifData. Daftar lengkap dari properti ini tersedia di sini. Kode berikut akan membaca semua tag EXIF menggunakan kelas System.Reflection.PropertyInfo.
String dataDir = Utils.getDataDir(ReadAllEXIFTagList.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Extract thumbnail data and store it as a separate image file. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
JpegExifData exifData = thumbnail.getJpegOptions().getExifData(); | |
if (exifData != null) { | |
for (int j = 0; j < exifData.getProperties().length; j++) { | |
System.out.println(exifData.getProperties()[j].getId() + ":" + exifData.getProperties()[j].getValue()); | |
} | |
} | |
} | |
} | |
} |
Mengoreksi Otomatis Orientasi Gambar JPEG
Foto dapat diambil dengan kamera yang diputar 90°, 180°, 270°, atau tidak sama sekali (orientasi normal). Kebanyakan kamera digital menyimpan informasi orientasi bersama dengan data gambar sebagai tag EXIF pada gambar JPEG. Informasi ini dapat digunakan untuk melakukan rotasi otomatis pada gambar untuk mengoreksi orientasi. API Aspose.PSD menyediakan metode AutoRotate untuk kelas JpegImage untuk mengoreksi otomatis orientasi gambar JPEG. Berikut cara menggunakannya dengan metode AutoRotate dengan Aspose.PSD untuk API Java.
String dataDir = Utils.getDataDir(AutoCorrectOrientationOfJPEGImages.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "1280px-Zebras_Serengeti.psd")) { | |
// Iterate over resources. | |
for (int i = 0; i < image.getImageResources().length; i++) { | |
// Find thumbnail resource. Typically they are in the Jpeg file format. | |
if (image.getImageResources()[i] instanceof ThumbnailResource || image.getImageResources()[i] instanceof Thumbnail4Resource) { | |
// Adjust thumbnail data. | |
ThumbnailResource thumbnail = (ThumbnailResource) image.getImageResources()[i]; | |
JpegExifData exifData = thumbnail.getJpegOptions().getExifData(); | |
if (exifData != null && exifData.getThumbnail() != null) { | |
// If there is thumbnail stored then auto-rotate it. | |
JpegImage jpegImage = (JpegImage) exifData.getThumbnail(); | |
if (jpegImage != null) { | |
jpegImage.autoRotate(); | |
} | |
} | |
} | |
} | |
// Save image. | |
image.save(); | |
} |
Dukungan untuk JPEG-LS dengan CMYK dan YCCK
API Aspose.PSD untuk Java menyediakan dukungan untuk model warna CMYK dan YCCK dengan JPEG-LS. Potongan kode di bawah ini menunjukkan cara menggunakan dukungan tersebut untuk JPEG-LS.
String dataDir = Utils.getDataDir(SupportForJPEGLSWithCMYK.class) + "ModifyingAndConvertingImages/"; | |
try (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.setColorType(JpegCompressionColorMode.Cmyk); | |
options.setCompressionType(JpegCompressionMode.JpegLs); | |
// The default profiles will be used. | |
options.setRgbColorProfile(null); | |
options.setCmykColorProfile(null); | |
image.save(dataDir + "output.jpg", options); | |
} | |
try (PsdImage image1 = (PsdImage) Image.load(dataDir + "PsdImage.psd")) { | |
JpegOptions options1 = new JpegOptions(); | |
//Just replace one line given below in examples to use YCCK instead of CMYK | |
//options.ColorType = JpegCompressionColorMode.Cmyk; | |
options1.setColorType(JpegCompressionColorMode.Cmyk); | |
options1.setCompressionType(JpegCompressionMode.Lossless); | |
// The default profiles will be used. | |
options1.setRgbColorProfile(null); | |
options1.setCmykColorProfile(null); | |
image1.save(dataDir + "output2.jpg", options1); | |
} |
Dukungan untuk 2-7 bit per sampel dalam gambar JPEG-LS
API Aspose.PSD untuk Java menyediakan dukungan untuk gambar JPEG-LS dengan 2-7 bit per sampel. Potongan kode di bawah ini menunjukkan cara menggunakan dukungan tersebut untuk JPEG-LS.
Mengatur Jenis Warna dan Jenis Kompresi untuk gambar JPEG
API Aspose.PSD untuk Java menyediakan dukungan untuk Tipe Warna dan Tipe Kompresi dan mengatur mereka sebagai skala abu-abu dan progresif untuk gambar JPEG. Potongan kode di bawah ini menunjukkan cara menggunakan dukungan tersebut.
String dataDir = Utils.getDataDir(ColorTypeAndCompressionType.class) + "ModifyingAndConvertingImages/"; | |
try (PsdImage image = (PsdImage) Image.load(dataDir + "PsdImage.psd")) { | |
JpegOptions options = new JpegOptions(); | |
options.setColorType(JpegCompressionColorMode.Grayscale); | |
options.setCompressionType(JpegCompressionMode.Progressive); | |
image.save(dataDir + "ColorTypeAndCompressionType_output.jpg", options); | |
} |