Unikaj degradacji wydajności podczas rysowania na skompresowanych obrazach
Unikaj degradacji wydajności podczas rysowania na skompresowanych obrazach
Są sytuacje, gdy chcesz przeprowadzić bardzo złożone operacje graficzne na skompresowanym obrazie. Gdy Aspose.PSD musi kompresować i dekompresować obrazy w locie, może wystąpić degradacja wydajności. Rysowanie na skompresowanych obrazach może również wpłynąć na wydajność.
Rozwiązanie
Aby uniknąć degradacji wydajności, zalecamy konwersję obrazu do formatu nieskompresowanego, tzw. formatu surowego, przed wykonaniem operacji graficznych.
Używanie ścieżki pliku
W poniższym przykładzie obraz PSD jest konwertowany do formatu surowego (bez kompresji) i zapisywany na dysku. Nieskompresowany obraz jest następnie ponownie wczytany przed wykonaniem na nim operacji graficznych. Ta sama technika można zastosować do plików BMP i 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. | |
} |
Użycie obiektu strumienia
Poniższy fragment kodu pokazuje, jak obraz PSD jest konwertowany do formatu surowego (bez kompresji) i zapisywany na dysku za pomocą strumienia.
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. | |
} |