Évitez la dégradation des performances lors du dessin sur des images compressées

Évitez la dégradation des performances lors du dessin sur des images compressées

Il arrive parfois que vous souhaitiez effectuer des opérations graphiques extrêmement vastes sur une image compressée. Lorsque Aspose.PSD doit compresser et décompresser des images à la volée, une dégradation des performances peut se produire. Le fait de dessiner sur des images compressées peut également entraîner une pénalité en termes de performances.

Solution

Pour éviter la dégradation des performances, nous vous recommandons de convertir l’image dans un format non compressé, c’est-à-dire brut, avant d’effectuer des opérations graphiques.

Utilisation du chemin de fichier

Dans l’exemple suivant, une image PSD est convertie en format brut (sans compression) et enregistrée sur le disque. L’image non compressée est ensuite chargée à nouveau avant d’effectuer des opérations graphiques dessus. La même technique s’applique aux fichiers BMP et GIF.

String dataDir = Utils.getDataDir(UncompressedImageUsingFile.class) + "PSD/";
// Load a PSD file as an image and cast it into PsdImage
try (PsdImage psdImage = (PsdImage) Image.load(dataDir + "layers.psd")) {
PsdOptions saveOptions = new PsdOptions();
saveOptions.setCompressionMethod(CompressionMethod.Raw);
psdImage.save(dataDir + "uncompressed_out.psd", saveOptions);
// Now reopen the newly created image.
PsdImage img = (PsdImage) Image.load(dataDir + "uncompressed_out.psd");
Graphics graphics = new Graphics(img);
// Perform graphics operations.
}

Utilisation d’un objet de flux

Le bout de code suivant vous montre comment convertir une image PSD en format brut (sans compression) et l’enregistrer sur le disque en utilisant un flux.

String dataDir = Utils.getDataDir(UncompressedImageStreamObject.class) + "PSD/";
ByteArrayOutputStream ms = new ByteArrayOutputStream();
// Load a PSD file as an image and cast it into PsdImage
try (PsdImage psdImage = (PsdImage) Image.load(dataDir + "layers.psd")) {
PsdOptions saveOptions = new PsdOptions();
saveOptions.setCompressionMethod(CompressionMethod.Raw);
psdImage.save(ms, saveOptions);
// Now reopen the newly created image. But first seek to the beginning of stream since after saving seek is at the end now.
ms.reset();
PsdImage img = (PsdImage) Image.load(new ByteArrayInputStream(ms.toByteArray()));
Graphics graphics = new Graphics(psdImage);
// Perform graphics operations.
}