|
Přidá barevný image XObject společně s PDF 1.4 soft-mask image XObject (ISO 32000-1 8.9.5.4), takže výsledný obrázek nese plnou průhlednost pro každý pixel místo binárního limitu zapnuto/vypnuto starší cesty /ImageMask
Syntaxe Delphi:
function AddImageWithSMask(Width, Height: Integer; const RGB: TBytes; const Alpha: TBytes): Integer;
function AddImageWithSMask32(Bitmap32: TBitmap): Integer;
Syntaxe C++:
__property int AddImageWithSMask(int Width, int Height, const TBytes& RGB, const TBytes& Alpha);
__property int AddImageWithSMask32(TBitmap* Bitmap32);
Popis
Obrázky SMask nesou nezávislý 8bitový kanál DeviceGray, jehož světlost řídí alfa kanál barevného obrázku při vykreslování (0 = plně průhledné, 255 = plně neprůhledné)
HotPDF emituje obě roviny jako image XObjecty komprimované Flate, napojí položku /SMask slovníku barevného obrázku na soft-mask XObject a vrátí index XImages, který THPDFPage.ShowImage přijímá přímo, takže veškerý navazující kód pro umístění funguje beze změn
AddImageWithSMask(Width, Height, RGB, Alpha)
- Width / Height: rozměry v pixelech, stejné pro obě roviny
- RGB: Width * Height * 3 bajtů, row-major shora dolů, R G B proložené po pixelech bez odsazení řádků
- Alpha: Width * Height bajtů, row-major shora dolů, 8bitová světlost pro každý pixel
AddImageWithSMask32(Bitmap32)
Pohodlné přetížení pro běžné workflow „mám PNG s alfa kanálem“
TBitmap musí mít PixelFormat = pf32bit; HotPDF čte řádky BGRA ScanLine přímo, přeuspořádá je na R G B pro barevnou rovinu a zkopíruje bajt A do alfa roviny před delegováním na nízkoúrovňový vstupní bod AddImageWithSMask
Návratová hodnota: index do XImages shodný s hodnotou, kterou vrací AddImage; předejte jej do THPDFPage.ShowImage pro umístění obrázku na stránku
Vrací -1, když je zapnutý StrictVersionLock a aktivní Version je nižší než PDF 1.4; jinak se verze automaticky zvýší na 1.4
Příklad kódu
// Raw-bytes path: build a 64x64 magenta-on-white plane + horizontal
// alpha gradient and place the result on the page
var
RGB, Alpha: TBytes;
W, H, X, Y, Idx, ImIdx: Integer;
begin
W := 64;
H := 64;
SetLength(RGB, W * H * 3);
SetLength(Alpha, W * H);
for Y := 0 to H - 1 do
for X := 0 to W - 1 do
begin
Idx := Y * W + X;
RGB[Idx * 3 + 0] := 255; // R
RGB[Idx * 3 + 1] := 0; // G
RGB[Idx * 3 + 2] := 255; // B
Alpha[Idx] := Byte((X * 255) div (W - 1));
end;
HPDF.Version := pdf14; // SMask requires PDF 1.4
HPDF.Compression := cmFlateDecode;
HPDF.BeginDoc;
ImIdx := HPDF.AddImageWithSMask(W, H, RGB, Alpha);
HPDF.CurrentPage.ShowImage(ImIdx, 80, 80, 256, 256, 0);
HPDF.EndDoc;
end;
Viz také
AddImage, THPDFPage.ShowImage, Version, Podpora filtrů PDF
|