Aspose.PSD dla .NET 20.11 - Notatki dotyczące wydania
Contents
[
Hide
]
Ta strona zawiera notatki dotyczące wydania Aspose.PSD dla .NET 20.11
Klucz | Podsumowanie | Kategoria |
---|---|---|
PSDNET-713 | Aspose.PSD nie może konwertować plików PSD do innych trybów kolorów/głębi bitowej bez zapisywania ich jako pliki | Funkcja |
PSDNET-754 | Dodaj możliwość kopiowania warstwy Smart Object w obrazie PSD | Funkcja |
PSDNET-267 | Wyjątek podczas ładowania i zapisywania pliku PSD z efektami warstwy | Błąd |
PSDNET-579 | Metoda “Image.LoadRawData” zgłasza wyjątek NullPointer | Błąd |
PSDNET-741 | Rzucany jest wyjątek ImageLoadException podczas próby otwarcia pliku | Błąd |
PSDNET-744 | Aspose.PSD 20.10: Nie można załadować pliku Psd | Błąd |
Zmiany w API publicznym
Dodane API:
- M:Aspose.PSD.FileFormats.Psd.PsdImage.Convert(Aspose.PSD.ImageOptions.PsdOptions)
- F:Aspose.PSD.FileFormats.Psd.ResourceBlock.ResouceBlockMeSaSignature
- M:Aspose.PSD.FileFormats.Psd.Layers.SmartObjects.SmartObjectLayer.NewSmartObjectViaCopy
- M:Aspose.PSD.FileFormats.Psd.Layers.SmartObjects.SmartObjectLayer.DuplicateLayer
- M:Aspose.PSD.FileFormats.Psd.SmartObjectProvider.NewSmartObjectViaCopy(Aspose.PSD.FileFormats.Psd.Layers.SmartObjects.SmartObjectLayer)
- M:Aspose.PSD.FileFormats.Psd.SmartObjectProvider.ConvertToSmartObject(System.Int32[])
- M:Aspose.PSD.FileFormats.Psd.SmartObjectProvider.ConvertToSmartObject(Aspose.PSD.FileFormats.Psd.Layers.Layer[])
Usunięte API:
- Brak
Przykłady użycia:
PSDNET-267. Wyjątek podczas ładowania i zapisywania pliku PSD z efektami warstwy
string dataDir = "PSDNET267_1\\";
string inputFilePath = dataDir + "LayerEffectsTest.psd";
string outputFilePath = dataDir + "LayerEffectsTestOutput.psd";
using (var image = (PsdImage)Image.Load(inputFilePath, new PsdLoadOptions() { LoadEffectsResource = true }))
{
image.Save(outputFilePath, new PsdOptions(image));
}
string dataDir = "PSDNET579_1\\";
string srcFile = dataDir + "CmykWithAlpha_raw.psd";
using (RasterImage image = (RasterImage)Image.Load(srcFile))
{
Rectangle rect = image.Bounds;
RawDataRetriever rawDataRetriever = new RawDataRetriever(rect, image.RawDataSettings);
image.LoadRawData(rect, image.RawDataSettings, rawDataRetriever);
rawDataRetriever.GetData();
}
class RawDataRetriever : Aspose.PSD.IPartialRawDataLoader
{
private readonly byte[] rawData;
private int rawDataIndex;
public RawDataRetriever(Rectangle rectangle, RawDataSettings rawDataSettings)
{
int totalSize = rawDataSettings.LineSize * rectangle.Height;
if (totalSize == 0)
{
totalSize = rectangle.Width * rectangle.Height * 5;
}
this.rawData = new byte[totalSize];
}
public byte[] GetData()
{
return this.rawData;
}
public void Process(Rectangle rectangle, byte[] data, Point start, Point end)
{
Array.Copy(data, 0, this.rawData, this.rawDataIndex, data.Length);
this.rawDataIndex += data.Length;
}
public void Process(Rectangle rectangle, byte[] data, Point start, Point end, LoadOptions loadOptions)
{
throw new NotImplementedException();
}
}
string dataDir = "PSDNET713_1\\";
string outputDir = dataDir + "output\\";
// Te przykłady demonstrują konwersję formatu obrazu PSD na inne tryby kolorów/głębi bitowej.
KonwersjaObrazu(ColorModes.Szary, 16, 2);
KonwersjaObrazu(ColorModes.Szary, 8, 2);
KonwersjaObrazu(ColorModes.Szary, 8, 1);
KonwersjaObrazu(ColorModes.Rgb, 8, 4);
KonwersjaObrazu(ColorModes.Rgb, 16, 4);
KonwersjaObrazu(ColorModes.Cmyk, 8, 5);
KonwersjaObrazu(ColorModes.Cmyk, 16, 5);
void KonwersjaObrazu(ColorModes trybKoloru, short liczbaBitowKanału, short liczbaKanałów)
{
var kompresja = liczbaBitowKanału > 8 ? CompressionMethod.Raw : CompressionMethod.RLE;
ZapiszDoPsdNastępnieZaładujIZapiszDoPng(
"SheetColorHighlightExample",
trybKoloru,
liczbaBitowKanału,
liczbaKanałów,
kompresja,
1);
ZapiszDoPsdNastępnieZaładujIZapiszDoPng(
"FillOpacitySample",
trybKoloru,
liczbaBitowKanału,
liczbaKanałów,
kompresja,
2);
ZapiszDoPsdNastępnieZaładujIZapiszDoPng(
"ClippingMaskRegular",
trybKoloru,
liczbaBitowKanału,
liczbaKanałów,
kompresja,
3);
}
// Zapisuje do PSD, a następnie wczytuje zapisany plik i zapisuje do PNG.
void ZapiszDoPsdNastępnieZaładujIZapiszDoPng(
string plik,
ColorModes trybKoloru,
short liczbaBitowKanału,
short liczbaKanałów,
CompressionMethod kompresja,
int numerWarstwy)
{
string srcFile = dataDir + plik + ".psd";
string postfix = trybKoloru.ToString() + liczbaBitowKanału + "bity" + liczbaKanałów + "kanały" +
kompresja;
string fileName = plik + "_" + postfix + ".psd";
string exportPath = outputDir + fileName;
PsdOptions psdOptions = new PsdOptions()
{
ColorMode = trybKoloru,
ChannelBitsCount = liczbaBitowKanału,
ChannelsCount = liczbaKanałów,
CompressionMethod = kompresja
};
using (var image = (PsdImage)Image.Load(srcFile))
{
image.Convert(psdOptions);
RasterCachedImage raster = image.Layers.Length > 0 && numerWarstwy >= 0
? (RasterCachedImage)image.Layers[numerWarstwy]
: image;
Aspose.PSD.Graphics graphics = new Graphics(raster);
int width = raster.Width;
int height = raster.Height;
Rectangle rect = new Rectangle(
width / 3,
height / 3,
width - (2 * (width / 3)) - 1,
height - (2 * (height / 3)) - 1);
graphics.DrawRectangle(new Aspose.PSD.Pen(Color.DarkGray, 1), rect);
image.Save(exportPath);
}
string pngExportPath = Path.ChangeExtension(exportPath, "png");
using (PsdImage image = (PsdImage)Image.Load(exportPath))
{
image.Save(pngExportPath, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
}
}
string dataDir = "PSDNET741_1\\";
string inputFile = dataDir + "input.psd";
string outputFile = dataDir + "output.psd";
using (var psdImage = (PsdImage)Image.Load(inputFile))
{
psdImage.Save(outputFile, new PsdOptions(psdImage));
}
using (var psdImage2 = (PsdImage)Image.Load(outputFile))
{
// Brak wyjątku tutaj...
}
void AreEqual(object expected, object actual)
{
if (!object.Equals(expected, actual))
{
throw new Exception("Wartości nie są równe.");
}
}
string srcFile = "GST-CHALLAN(2)1..psd";
string output = "output.psd";
using (PsdImage psdImage = (PsdImage)Image.Load(srcFile))
{
AreEqual(ResourceBlock.ResouceBlockMeSaSignature, psdImage.ImageResources[23].Signature);
AreEqual(ResourceBlock.ResouceBlockMeSaSignature, psdImage.ImageResources[24].Signature);
psdImage.Save(output);
}
string dataDir = "PSDNET754_1\\";
string outputDir = dataDir + "output\\";
// Te przykłady demonstrują, jak kopiować warstwy obiektów Smart w obrazie PSD.
PrzykładKopiowaniaWarstwySmartObject("r-embedded-psd");
PrzykładKopiowaniaWarstwySmartObject("r-embedded-png");
PrzykładKopiowaniaWarstwySmartObject("r-embedded-transform");
PrzykładKopiowaniaWarstwySmartObject("new_panama-papers-8-trans4");
void PrzykładKopiowaniaWarstwySmartObject(string nazwaPliku)
{
int numerWarstwy = 0; // Numer warstwy do skopiowania
string filePath = dataDir + nazwaPliku + ".psd";
string outputFilePath = outputDir + nazwaPliku + "_copy_" + numerWarstwy;
string pngOutputPath = outputFilePath + ".png";
string psdOutputPath = outputFilePath + ".psd";
using (PsdImage image = (PsdImage)Image.Load(filePath))
{
var warstwaSmartObject = (SmartObjectLayer)image.Layers[numerWarstwy];
var nowaWarstwa = warstwaSmartObject.NewSmartObjectViaCopy();
nowaWarstwa.IsVisible = false;
AssertIsTrue(object.ReferenceEquals(nowaWarstwa, image.Layers[numerWarstwy + 1]));
AssertIsTrue(object.ReferenceEquals(warstwaSmartObject, image.Layers[numerWarstwy]));
var zduplikowanaWarstwa = warstwaSmartObject.DuplicateLayer();
zduplikowanaWarstwa.DisplayName = warstwaSmartObject.DisplayName + " wspólny obraz";
AssertIsTrue(object.ReferenceEquals(nowaWarstwa, image.Layers[numerWarstwy + 2]));
AssertIsTrue(object.ReferenceEquals(zduplikowanaWarstwa, image.Layers[numerWarstwy + 1]));
AssertIsTrue(object.ReferenceEquals(warstwaSmartObject, image.Layers[numerWarstwy]));
using (var wewnętrznyObraz = (RasterImage)warstwaSmartObject.LoadContents(null))
{
// Odwracamy osadzony obrazek Smart Object (dla wewnętrznego obrazu PSD odwracamy tylko jego pierwszą warstwę)
OdwróćObraz(wewnętrznyObraz);
// Zastępujemy osadzony obraz Smart Object w warstwie PSD
warstwaSmartObject.ReplaceContents(wewnętrznyObraz);
}
// Zduplikowana warstwa dzieli swój osadzony obrazem Smart Object
// i musi zostać zaktualizowana w sposób jawnie, w przeciwnym razie jej bufor renderowania pozostanie niezmieniony.
// Aktualizujemy każdy obiekt Smart Object, aby upewnić się, że nowa warstwa utworzona przez NewSmartObjectViaCopy
// nie dzieli obrazka osadzonego z innymi.
image.SmartObjectProvider.UpdateAllModifiedContent();
image.Save(pngOutputPath, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
image.Save(psdOutputPath, new PsdOptions(image));
}
}
// Odwraca obraz rastrowy wraz z obrazem PSD.
void OdwróćObraz(RasterImage wewnętrznyObraz)
{
var wewnętrznyPsdObraz = wewnętrznyObraz as PsdImage;
if (wewnętrznyPsdObraz != null)
{
OdwróćObrazRastrowy(wewnętrznyPsdObraz.Layers[0]);
}
else
{
OdwróćObrazRastrowy(wewnętrznyObraz);
}
}
// Odwraca obraz rastrowy.
void OdwróćObrazRastrowy(RasterImage wewnętrznyObraz)
{
var pixele = wewnętrznyObraz.LoadArgb32Pixels(wewnętrznyObraz.Bounds);
for (int i = 0; i < pixele.Length; i++)
{
var piksel = pixele[i];
var alpha = (int)(piksel & 0xff000000);
pixele[i] = (~(piksel & 0x00ffffff)) | alpha;
}
wewnętrznyObraz.SaveArgb32Pixels(wewnętrznyObraz.Bounds, pixele);
}
void AssertIsTrue(bool warunek)
{
if (!warunek)
{
throw new FormatException(string.Format("Oczekiwano prawdy"));
}
}