|
یک فضای رنگ Separation در PDF 1.3+ را اعلام میکند (ISO 32000-1 8.6.6.4) که tint transform آن یک lookup table نمونهبرداریشده از نوع Function Type 0 است (ISO 32000-1 7.10.2). وقتی منحنی رنگ spot-ink غیرخطی است از این متد استفاده کنید - rampهای tint به سبک PANTONE Hexachrome، منحنیهای چگالی با gamma correction، منحنیهای tone دستکشیده که با مشخصات press مطابقت دارند، LUTهای ICC برای تبدیل sRGB به spot بدون سازوکار کامل پروفایل ICC. برای ramp خطی ساده از صفر تا یک نقطه پایان رنگ با شدت کامل، نقطه ورود v2.45.0 RegisterSeparation همچنان کاربرد دارد
نحو Delphi:
function RegisterSeparationLUT(const ColorantName: AnsiString; const AlternateCS: AnsiString; const Samples: array of byte): AnsiString;
نحو C++:
AnsiString RegisterSeparationLUT(const AnsiString& ColorantName, const AnsiString& AlternateCS, const unsigned char* Samples, int SamplesCount);
توضیح
HotPDF بهصورت داخلی RegisterSampledFunction را فراخوانی میکند تا جریان Function Type 0 را با /Domain [0 1]، /Range که هر channel از alt-CS را در [0, 1] پوشش میدهد، /Size [S] که در آن S = Length(Samples) / M، /BitsPerSample 8 و /Order 1 (interpolation خطی) بسازد. این function در یک آرایه color-space تازه [/Separation /ColorantName /AltCS <FuncRef>] که بین صفحات مشترک است قرار میگیرد و با چیدمان تولیدشده توسط RegisterSeparation مطابقت دارد - مسیرهای کد SetFillColorSpace + SetFillColor در پاییندست بین این دو variant ثبتکننده هیچ تغییری در سطح API نمیبینند
ColorantName - PDF Name جوهر (برای نمونه 'PANTONE 185 C'، 'CutContour'، 'White'). فاصلهها طبق PDF 1.7 7.3.5 توسط مسیر name-writer موجود به #20 escape میشوند
AlternateCS - 'DeviceGray' (M = 1)، 'DeviceRGB' (M = 3) یا 'DeviceCMYK' (M = 4). جریان نمونه به ازای هر grid point، M بایت خروجی فراهم میکند. هر مقدار دیگری یک exception ایجاد میکند
Samples - بایتهای خام نمونه 8-bit که برای S grid point به صورت (c0_0, c1_0, ..., cM-1_0, c0_1, ..., cM-1_S-1) مرتب شدهاند. Length(Samples) باید مضرب مثبتی از M باشد؛ S از Length(Samples) / M استنباط میشود و باید دستکم 2 باشد تا function بازه قابل interpolation داشته باشد. interpolation خطی بین grid pointها پیشفرض است (PDF 1.7 /Order 1)
Return value: یک نام color-space تولیدشده بهصورت خودکار (Sep1، Sep2، ...). entry مربوط به Separation با registry v2.45.0 RegisterSeparation مشترک است، بنابراین نامها در دو variant بهصورت یکنواخت افزایش مییابند. وقتی StrictVersionLock روشن باشد و Version فعال پایینتر از PDF 1.3 باشد یک رشته خالی برمیگرداند (در غیر این صورت نسخه سند بهطور خودکار به 1.3 ارتقا مییابد)
نمونه کد
// Register a 'HeatLUT' Separation over DeviceRGB whose tint -> RGB
// curve is a 256-sample blue -> green -> red heatmap
var
CSName: AnsiString;
Samples: array[0..767] of byte; // 256 * 3 RGB
I: Integer;
T: Single;
begin
HPDF.BeginDoc;
for I := 0 to 255 do
begin
T := I / 255.0;
if T < 0.5 then
begin
Samples[I*3 + 0] := 0;
Samples[I*3 + 1] := byte(Round(2.0 * T * 255.0));
Samples[I*3 + 2] := byte(Round((1.0 - 2.0*T) * 255.0));
end
else
begin
Samples[I*3 + 0] := byte(Round(2.0 * (T - 0.5) * 255.0));
Samples[I*3 + 1] := byte(Round((1.0 - 2.0*(T - 0.5)) * 255.0));
Samples[I*3 + 2] := 0;
end;
end;
CSName := HPDF.RegisterSeparationLUT('HeatLUT', 'DeviceRGB', Samples);
HPDF.CurrentPage.SetFillColorSpace(CSName);
HPDF.CurrentPage.SetFillColor([0.5]); // midpoint -> pure green
HPDF.CurrentPage.Rectangle(100, 100, 40, 40);
HPDF.CurrentPage.Fill;
HPDF.EndDoc;
end;
See Also
RegisterSeparation, RegisterSampledFunction, RegisterDeviceN, Version, PDF Filter Support
|