Vyhněte se degradaci výkonu při kreslení nad komprimovanými obrázky
Vyhněte se degradaci výkonu při kreslení nad komprimovanými obrázky
Jsou okamžiky, kdy chcete provádět extrémně rozsáhlé grafické operace na komprimovaném obrázku. Když musí Aspose.PSD komprimovat a dekomprimovat obrázky na letu, může dojít k degradaci výkonu. Kreslení nad komprimovanými obrázky může také nést pokutu za výkon.
Řešení
Abychom zabránili degradaci výkonu, doporučujeme převést obrázek do nepožitého nebo surového formátu před provedením grafických operací.
Použití cesty k souboru
V následujícím příkladu je obrázek PSD převeden do nepožitého formátu (bez komprese) a uložen na disk. Nepožitý obrázek je pak načten zpět před provedením grafických operací na něm. Stejná technika platí pro soubory BMP a 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. | |
} |
Použití objektu Stream
Následující ukázka kódu vám ukazuje, jak je obrázek PSD převeden do nepožitého formátu (bez komprese) a uložen na disk pomocí objektu Stream.
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. | |
} |