Mengkonversi Gambar

Mengkonversi Gambar ke Hitam Putih dan Grayscale

Terkadang Anda mungkin perlu mengonversi gambar berwarna ke Hitam Putih atau Grayscale untuk tujuan mencetak atau pengarsipan. Artikel ini menunjukkan penggunaan Aspose.PSD untuk Java API untuk mencapai hal ini menggunakan dua metode sebagai berikut.

  • Binarisasi
  • Grayscaling

Binarisasi

Untuk memahami konsep Binarisasi, penting untuk mendefinisikan Gambar Biner; yaitu gambar digital yang hanya dapat memiliki dua nilai yang mungkin untuk setiap pixel. Biasanya, dua warna yang digunakan untuk gambar biner adalah hitam dan putih meskipun dua warna apa pun dapat digunakan. Binarisasi adalah proses mengonversi gambar ke tingkat dua yang berarti setiap pixel disimpan sebagai satu bit (0 atau 1) di mana 0 mengindikasikan ketiadaan warna dan 1 berarti keberadaan warna. Aspose.PSD untuk Java API saat ini mendukung dua metode Binarisasi.

Binarisasi dengan Ambang Tetap

Potongan kode berikut menunjukkan bagaimana binarisasi ambang tetap dapat diterapkan pada gambar.

String dataDir = Utils.getDataDir(BinarizationWithFixedThreshold.class) + "Conversion/";
String sourceFile = dataDir + "sample.psd";
String destName = dataDir + "BinarizationWithFixedThreshold_out.jpg";
try (Image image = Image.load(sourceFile);
RasterCachedImage rasterCachedImage = (RasterCachedImage) image) {
if (!rasterCachedImage.isCached()) {
// Cache image if not already cached
rasterCachedImage.cacheData();
}
// Binarize image with predefined fixed threshold and Save the resultant image
rasterCachedImage.binarizeFixed((byte) 100);
rasterCachedImage.save(destName, new JpegOptions());
}

Binarisasi dengan Ambang Otsu

Potongan kode berikut menunjukkan bagaimana binarisasi ambang Otsu dapat diterapkan pada gambar.

String dataDir = Utils.getDataDir(BinarizationWithOtsuThreshold.class) + "Conversion/";
String sourceFile = dataDir + "sample.psd";
String destName = dataDir + "BinarizationWithOtsuThreshold_out.jpg";
try (Image image = Image.load(sourceFile);
// Cast the image to RasterCachedImage and Check if image is cached
RasterCachedImage rasterCachedImage = (RasterCachedImage) image) {
if (!rasterCachedImage.isCached()) {
// Cache image if not already cached
rasterCachedImage.cacheData();
}
// Binarize image with Otsu Thresholding and Save the resultant image
rasterCachedImage.binarizeOtsu();
rasterCachedImage.save(destName, new JpegOptions());
}

Grayscaling

Grayscale adalah proses mengonversi gambar dengan nada yang kontinu menjadi gambar dengan nada abu-abu yang terputus-putus. Potongan kode berikut menunjukkan cara menggunakan Grayscale.

String dataDir = Utils.getDataDir(GrayScaling.class) + "Conversion/";
String sourceFile = dataDir + "sample.psd";
String destName = dataDir + "Grayscaling_out.jpg";
try (Image image = Image.load(sourceFile)) {
// Cast the image to RasterCachedImage and Check if image is cached
RasterCachedImage rasterCachedImage = (RasterCachedImage) image;
if (!rasterCachedImage.isCached()) {
// Cache image if not already cached
rasterCachedImage.cacheData();
}
// Transform image to its grayscale representation and Save the resultant image
rasterCachedImage.grayscale();
rasterCachedImage.save(destName, new JpegOptions());
}

Mengkonversi Layer Gambar GIF ke Gambar TIFF

Terkadang diperlukan untuk mengekstrak dan mengonversi lapisan dari Gambar PSD ke format gambar raster lain untuk memenuhi kebutuhan aplikasi. API Aspose.PSD mendukung fitur mengekstrak dan mengonversi lapisan dari Gambar PSD ke format gambar raster lain. Pertama, kita akan membuat instansi gambar dan memuat gambar PSD dari disk lokal, kemudian kita akan mengulangi setiap lapisan dalam properti Layer. Kemudian kami akan mengonversi blok ke gambar TIFF. Potongan kode berikut menunjukkan cara mengonversi lapisan gambar PSD ke gambar TIFF.

String dataDir = Utils.getDataDir(GIFImageLayersToTIFF.class) + "Conversion/";
String sourceFile = dataDir + "sample.psd";
// Load a PSD image and Convert the image's layers to Tiff images.
try (PsdImage image = (PsdImage) Image.load(sourceFile)) {
// Iterate through array of PSD layers
for (int i = 0; i < image.getLayers().length; i++) {
// Get PSD layer.
Layer layer = image.getLayers()[i];
// Create an instance of TIFF Option class and Save the PSD layer as TIFF image
TiffOptions objTiff = new TiffOptions(TiffExpectedFormat.TiffDeflateRgb);
layer.save("output" + i + "_out.tiff", objTiff);
}
}

Mengkonversi CMYK PSD ke CMYK TIFF

Menggunakan Aspose.PSD untuk Java, pengembang dapat mengonversi file CMYK PSD ke format tiff CMYK. Artikel ini menunjukkan bagaimana cara mengekspor / mengonversi file CMYK PSD ke format tiff CMYK dengan Aspose.PSD. Menggunakan Aspose.PSD untuk Java Anda dapat memuat gambar PSD dan kemudian Anda dapat mengatur berbagai properti menggunakan kelas TiffOptions dan menyimpan atau mengekspor gambar. Potongan kode berikut menunjukkan cara mencapai fitur ini.

String dataDir = Utils.getDataDir(CMYKPSDtoCMYKTiff.class) + "Conversion/";
String sourceFile = dataDir + "sample.psd";
String destName = dataDir + "output.tiff";
try (Image image = Image.load(sourceFile)) {
image.save(destName, new TiffOptions(TiffExpectedFormat.TiffLzwCmyk));
}

Mengekspor Gambar

Selain serangkaian rutinitas pemrosesan gambar yang kaya, Aspose.PSD menyediakan kelas-kelas khusus untuk mengonversi format file PSD ke format lain. Dengan menggunakan pustaka ini, konversi gambar PSD sangat sederhana dan intuitif. Berikut adalah beberapa kelas khusus untuk tujuan ini dalam ruang nama ImageOptions.

  • BmpOptions
  • GifOptions
  • JpegOptions
  • Jpeg2000Options
  • TiffOptions
  • PngOptions

Mudah untuk mengekspor gambar PSD dengan Aspose.PSD untuk Java API. Yang Anda butuhkan hanyalah objek dari kelas yang sesuai dari ruang nama ImageOptions. Dengan menggunakan kelas-kelas ini, Anda dapat dengan mudah mengekspor gambar apa pun yang dibuat, diedit, atau hanya dimuat dengan Aspose.PSD untuk Java ke format yang didukung.

Menggabungkan Gambar

Contoh ini menggunakan kelas Grafik dan menunjukkan cara menggabungkan dua atau lebih gambar menjadi gambar tunggal lengkap. Untuk mendemonstrasikan operasi, contoh membuat gambar PsdImage baru dan menggambar gambar pada permukaan kanvas menggunakan metode Draw Image yang terekspos oleh kelas Grafik. Dengan menggunakan kelas Grafik, dua atau lebih gambar dapat digabungkan dengan cara sedemikian rupa sehingga gambar hasilnya akan terlihat sebagai gambar lengkap tanpa ruang antara bagian gambar dan tanpa halaman. Ukuran kanvas harus sama dengan ukuran gambar hasil. Berikut adalah demontrasi kode yang menunjukkan cara menggunakan metode Draw Image dari kelas Grafik untuk menggabungkan gambar menjadi gambar tunggal.

String dataDir = Utils.getDataDir(CombiningImages.class) + "DrawingAndFormattingImages/";
// Create an instance of PsdOptions and set its various properties
PsdOptions imageOptions = new PsdOptions();
// Create an instance of FileCreateSource and assign it to Source property
imageOptions.setSource(new FileCreateSource(dataDir + "Two_images_result_out.psd", false));
try (Image image = Image.create(imageOptions, 600, 600)) {
// Create and initialize an instance of Graphics, Clear the image surface with white color and Draw Image
Graphics graphics = new Graphics(image);
graphics.clear(Color.getWhite());
graphics.drawImage(Image.load(dataDir + "example1.psd"), 0, 0, 300, 600);
graphics.drawImage(Image.load(dataDir + "example2.psd"), 300, 0, 300, 600);
image.save();
}

Memperluas dan Mencrop Gambar

API Aspose.PSD memungkinkan Anda untuk memperluas atau mencrop gambar selama proses konversi gambar. Pengembang perlu membuat persegi panjang dengan koordinat X dan Y dan menentukan lebar dan tinggi kotak persegi panjang. Koordinat X,Y dan Lebar, Tinggi dari persegi panjang akan menggambarkan perluasan atau pencrop-an dari gambar yang dimuat. Jika diperlukan memperluas atau mencrop gambar selama konversi gambar, lakukan langkah-langkah berikut:

  1. Buat instansi kelas RasterImage dan muat gambar yang ada.
  2. Buat Instance kelas ImageOption.
  3. Buat instansi kelas Rectangle dan inisialisasi X,Y dan Lebar, Tinggi dari persegi panjang
  4. Panggil metode Save dari kelas RasterImage sambil melewati nama file output, opsi gambar, dan objek persegi panjang sebagai parameter.
String dataDir = Utils.getDataDir(ExpandAndCropImages.class) + "DrawingAndFormattingImages/";
String sourceFile = dataDir + "example1.psd";
String destName = dataDir + "jpeg_out.jpg";
try (RasterImage rasterImage = (RasterImage) Image.load(sourceFile)) {
rasterImage.cacheData();
// Create an instance of Rectangle class and define X,Y and Width, height of the rectangle, and Save output image
Rectangle destRect = new Rectangle(-200, -200, 300, 300);
rasterImage.save(destName, new JpegOptions(), destRect);
}

Membaca dan Menulis Data XMP ke Gambar

XMP (Extensible Metadata Platform) adalah standar ISO. XMP memstandarisasi model data, format serialisasi, dan properti inti untuk definisi dan pemrosesan metadata yang dapat diperluas. Ini juga memberikan panduan untuk menyematkan informasi XMP ke gambar populer seperti JPEG, tanpa merusak keberbacaan mereka oleh aplikasi yang tidak mendukung XMP. Menggunakan Aspose.PSD untuk Java API, pengembang dapat membaca atau menulis metadata XMP ke gambar. Artikel ini menunjukkan bagaimana metadata XMP dapat dibaca dari gambar dan menulis metadata XMP ke gambar.

Buat Metadata XMP, Tulis dan Baca Dari File

Dengan bantuan ruang nama XMP, pengembang dapat membuat objek metadata XMP dan menulisnya ke gambar. Potongan kode berikut menunjukkan cara menggunakan paket-paket XmpHeaderPi, XmpTrailerPi, XmpMeta, XmpPacketWrapper, PhotoshopPackage, dan DublinCorePackage yang terkandung dalam ruang nama XMP.

String dataDir = Utils.getDataDir(CreateXMPMetadata.class) + "DrawingAndFormattingImages/";
// Specify the size of image by defining a Rectangle
Rectangle rect = new Rectangle(0, 0, 100, 200);
// create the brand new image just for sample purposes
try (PsdImage image = new PsdImage(rect.getWidth(), rect.getHeight())) {
// create an instance of XMP-Header
XmpHeaderPi xmpHeader = new XmpHeaderPi();
xmpHeader.setGuid(dataDir);
// create an instance of Xmp-TrailerPi
XmpTrailerPi xmpTrailer = new XmpTrailerPi(true);
// create an instance of XMPmeta class to set different attributes
XmpMeta xmpMeta = new XmpMeta();
xmpMeta.addAttribute("Author", "Mr Smith");
xmpMeta.addAttribute("Description", "The fake metadata value");
// create an instance of XmpPacketWrapper that contains all metadata
XmpPacketWrapper xmpData = new XmpPacketWrapper(xmpHeader, xmpTrailer, xmpMeta);
// create an instacne of Photoshop package and set photoshop attributes
PhotoshopPackage photoshopPackage = new PhotoshopPackage();
photoshopPackage.setCity("London");
photoshopPackage.setCountry("England");
photoshopPackage.setColorMode(ColorMode.Rgb);
// add photoshop package into XMP metadata
xmpData.addPackage(photoshopPackage);
// create an instacne of DublinCore package and set dublinCore attributes
DublinCorePackage dublinCorePackage = new DublinCorePackage();
dublinCorePackage.setAuthor("Charles Bukowski");
dublinCorePackage.setTitle("Confessions of a Man Insane Enough to Live With the Beasts");
dublinCorePackage.addValue("dc:movie", "Barfly");
// add dublinCore Package into XMP metadata
xmpData.addPackage(dublinCorePackage);
MemoryStream ms = new MemoryStream();
// update XMP metadata into image
image.setXmpData(xmpData);
// Save image on the disk or in memory stream
image.save(dataDir + "create_XMP_Metadata.psd");
}

Mengekspor Gambar dalam Lingkungan Berulang

Aspose.PSD untuk Java sekarang mendukung mengonversi gambar dalam lingkungan berulang. Aspose.PSD untuk Java memastikan kinerja yang dioptimalkan dari operasi selama eksekusi kode dalam lingkungan multi-threaded. Semua kelas opsi gambar (mis. BmpOptions, TiffOptions, JpegOptions, dll.) dalam Aspose.PSD untuk Java mengimplementasikan antarmuka IDisposable. Oleh karena itu penting bagi pengembang untuk membuang objek kelas opsi gambar dengan benar jika properti Source diatur. Potongan kode berikut menunjukkan fungsionalitas yang disebutkan.

String dataDir = Utils.getDataDir(ExportImagesinMultiThreadEnv.class) + "Conversion/";
String imageDataPath = dataDir + "sample.psd";
try {
FileInputStream fileStream = new FileInputStream(imageDataPath);
PsdOptions psdOptions = new PsdOptions();
// Set the source property of the imaging option class object.
psdOptions.setSource(new StreamSource(fileStream));
// Following is the sample processing on the image.
RasterImage image = (RasterImage) Image.create(psdOptions, 10, 10);
Color[] pixels = new Color[4];
for (int i = 0; i < 4; ++i) {
pixels[i] = Color.fromArgb(40, 30, 20, 10);
}
image.savePixels(new Rectangle(0, 0, 2, 2), pixels);
image.save();
} finally {
// Delete the output file.
File f = new File(imageDataPath);
if (f.exists()) {
f.delete();
}
}

Aspose.PSD sekarang mendukung properti SyncRoot saat bekerja di lingkungan multi-threaded. Pengembang dapat menggunakan properti ini untuk menyinkronkan akses ke aliran sumber. Potongan kode berikut menunjukkan bagaimana properti SyncRoot dapat digunakan.

String dataDir = Utils.getDataDir(SyncRoot.class) + "Conversion/";
// Create an instance of Stream container class and assign memory stream object.
StreamContainer streamContainer = new StreamContainer(new java.io.ByteArrayInputStream(new byte[0]));
try {
// check if the access to the stream source is synchronized.
synchronized (streamContainer.getSyncRoot()) {
// do work
// now access to streamContainer is synchronized
}
} finally {
streamContainer.dispose();
}