You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
6.6 KiB
242 lines
6.6 KiB
4 years ago
|
unit demo1;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||
|
ExtCtrls, StdCtrls, ExtDlgs, lcmsdll, ComCtrls;
|
||
|
|
||
|
type
|
||
|
TForm1 = class(TForm)
|
||
|
|
||
|
Image1: TImage;
|
||
|
Image2: TImage;
|
||
|
Panel1: TPanel;
|
||
|
Splitter1: TSplitter;
|
||
|
Button2: TButton;
|
||
|
ComboBoxInput: TComboBox;
|
||
|
ComboBoxOutput: TComboBox;
|
||
|
Label1: TLabel;
|
||
|
Label2: TLabel;
|
||
|
WBCompensation: TCheckBox;
|
||
|
NoTransform: TCheckBox;
|
||
|
RadioGroup1: TRadioGroup;
|
||
|
OpenPictureDialog1: TOpenPictureDialog;
|
||
|
Button1: TButton;
|
||
|
ProgressBar1: TProgressBar;
|
||
|
ComboBoxIntent: TComboBox;
|
||
|
Label3: TLabel;
|
||
|
Button3: TButton;
|
||
|
Button4: TButton;
|
||
|
OpenDialog1: TOpenDialog;
|
||
|
|
||
|
procedure Button2Click(Sender: TObject);
|
||
|
procedure Button1Click(Sender: TObject);
|
||
|
procedure Button3Click(Sender: TObject);
|
||
|
procedure Button4Click(Sender: TObject);
|
||
|
private
|
||
|
{ Private declarations }
|
||
|
function ComputeFlags: DWORD;
|
||
|
|
||
|
public
|
||
|
constructor Create(Owner: TComponent); Override;
|
||
|
{ Public declarations }
|
||
|
end;
|
||
|
|
||
|
var
|
||
|
Form1: TForm1;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
{$R *.DFM}
|
||
|
|
||
|
CONST
|
||
|
IS_INPUT = $1;
|
||
|
IS_DISPLAY = $2;
|
||
|
IS_COLORSPACE = $4;
|
||
|
IS_OUTPUT = $8;
|
||
|
IS_ABSTRACT = $10;
|
||
|
|
||
|
|
||
|
FUNCTION InSignatures(Signature:icProfileClassSignature; dwFlags: DWORD): Boolean;
|
||
|
BEGIN
|
||
|
|
||
|
if (((dwFlags AND IS_DISPLAY) <> 0) AND (Signature = icSigDisplayClass)) then InSignatures := TRUE
|
||
|
else
|
||
|
if (((dwFlags AND IS_OUTPUT) <> 0) AND (Signature = icSigOutputClass)) then InSignatures := TRUE
|
||
|
else
|
||
|
if (((dwFlags AND IS_INPUT) <> 0) AND (Signature = icSigInputClass)) then InSignatures := TRUE
|
||
|
else
|
||
|
if (((dwFlags AND IS_COLORSPACE) <> 0) AND (Signature = icSigColorSpaceClass)) then InSignatures := TRUE
|
||
|
else
|
||
|
if (((dwFlags AND IS_ABSTRACT) <> 0) AND (Signature = icSigAbstractClass)) then InSignatures := TRUE
|
||
|
else
|
||
|
InSignatures := FALSE
|
||
|
END;
|
||
|
|
||
|
PROCEDURE FillCombo(var Combo: TComboBox; Signatures: DWORD);
|
||
|
var
|
||
|
Files, Descriptions : TStringList;
|
||
|
Found: Integer;
|
||
|
SearchRec: TSearchRec;
|
||
|
Path, Profile: String;
|
||
|
Dir: ARRAY[0..1024] OF Char;
|
||
|
hProfile : cmsHPROFILE;
|
||
|
begin
|
||
|
Files := TStringList.Create;
|
||
|
Descriptions := TStringList.Create;
|
||
|
GetSystemDirectory(Dir, 1023);
|
||
|
Path := String(Dir) + '\SPOOL\DRIVERS\COLOR\';
|
||
|
Found := FindFirst(Path + '*.icm', faAnyFile, SearchRec);
|
||
|
while Found = 0 do
|
||
|
begin
|
||
|
Profile := Path + SearchRec.Name;
|
||
|
hProfile := cmsOpenProfileFromFile(PChar(Profile), 'r');
|
||
|
if (hProfile <> NIL) THEN
|
||
|
begin
|
||
|
|
||
|
if ((cmsGetColorSpace(hProfile) = icSigRgbData) AND
|
||
|
InSignatures(cmsGetDeviceClass(hProfile), Signatures)) then
|
||
|
begin
|
||
|
Descriptions.Add(cmsTakeProductDesc(hProfile));
|
||
|
Files.Add(Profile);
|
||
|
end;
|
||
|
cmsCloseProfile(hProfile);
|
||
|
end;
|
||
|
|
||
|
Found := FindNext(SearchRec);
|
||
|
|
||
|
end;
|
||
|
FindClose(SearchRec);
|
||
|
Combo.Items := Descriptions;
|
||
|
Combo.Tag := Integer(Files);
|
||
|
end;
|
||
|
|
||
|
|
||
|
constructor TForm1.Create(Owner: TComponent);
|
||
|
begin
|
||
|
inherited Create(Owner);
|
||
|
FillCombo(ComboBoxInput, IS_INPUT OR IS_COLORSPACE OR IS_DISPLAY);
|
||
|
FillCombo(ComboBoxOutput, $FFFF {IS_DISPLAY} );
|
||
|
ComboBoxIntent.ItemIndex := INTENT_PERCEPTUAL;
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button2Click(Sender: TObject);
|
||
|
begin
|
||
|
if OpenPictureDialog1.Execute then begin
|
||
|
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
|
||
|
Image1.Picture.Bitmap.PixelFormat := pf24bit;
|
||
|
Image2.Picture.Bitmap := TBitmap.Create;
|
||
|
Image2.Picture.Bitmap.PixelFormat := pf24bit;
|
||
|
Image2.Picture.Bitmap.Dormant;
|
||
|
Image2.Picture.Bitmap.width := Image1.Picture.Bitmap.width;
|
||
|
Image2.Picture.Bitmap.height := Image1.Picture.Bitmap.height;
|
||
|
end
|
||
|
end;
|
||
|
|
||
|
function SelectedFile(var Combo: TComboBox):string;
|
||
|
var List: TStringList;
|
||
|
n: Integer;
|
||
|
begin
|
||
|
|
||
|
List := TStringList(Combo.Tag);
|
||
|
n := Combo.ItemIndex;
|
||
|
if (n >= 0) then
|
||
|
SelectedFile := List.Strings[n]
|
||
|
else
|
||
|
SelectedFile := Combo.Text;
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TForm1.ComputeFlags: DWORD;
|
||
|
var dwFlags: DWORD;
|
||
|
begin
|
||
|
dwFlags := 0;
|
||
|
if (WBCompensation.Checked) then
|
||
|
begin
|
||
|
dwFlags := dwFlags OR cmsFLAGS_WHITEBLACKCOMPENSATION
|
||
|
end;
|
||
|
|
||
|
if (NoTransform.Checked) then
|
||
|
begin
|
||
|
dwFlags := dwFlags OR cmsFLAGS_NULLTRANSFORM
|
||
|
end;
|
||
|
|
||
|
|
||
|
case RadioGroup1.ItemIndex of
|
||
|
0: dwFlags := dwFlags OR cmsFLAGS_NOTPRECALC;
|
||
|
2: dwFlags := dwFlags OR cmsFLAGS_HIGHRESPRECALC;
|
||
|
3: dwFlags := dwFlags OR cmsFLAGS_LOWRESPRECALC;
|
||
|
end;
|
||
|
|
||
|
ComputeFlags := dwFlags
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button1Click(Sender: TObject);
|
||
|
var
|
||
|
Source, Dest: String;
|
||
|
hSrc, hDest : cmsHPROFILE;
|
||
|
xform: cmsHTRANSFORM;
|
||
|
i, PicW, PicH: Integer;
|
||
|
Intent: Integer;
|
||
|
dwFlags : DWORD;
|
||
|
begin
|
||
|
|
||
|
|
||
|
Source := SelectedFile(ComboBoxInput);
|
||
|
Dest := SelectedFile(ComboBoxOutput);
|
||
|
|
||
|
dwFlags := ComputeFlags;
|
||
|
|
||
|
Intent := ComboBoxIntent.ItemIndex;
|
||
|
|
||
|
if (Source <> '') AND (Dest <> '') then
|
||
|
begin
|
||
|
hSrc := cmsOpenProfileFromFile(PChar(Source), 'r');
|
||
|
hDest:= cmsOpenProfileFromFile(PChar(Dest), 'r');
|
||
|
|
||
|
xform := cmsCreateTransform(hSrc, TYPE_BGR_8, hDest, TYPE_BGR_8,
|
||
|
Intent, dwFlags);
|
||
|
|
||
|
|
||
|
PicW := Image2.Picture.Width;
|
||
|
PicH := Image2.Picture.Height;
|
||
|
ProgressBar1.Min := 0;
|
||
|
ProgressBar1.Max := PicH;
|
||
|
ProgressBar1.Step := 1;
|
||
|
|
||
|
for i:= 0 TO (PicH -1) do
|
||
|
begin
|
||
|
if ((i MOD 100) = 0) then
|
||
|
ProgressBar1.Position := i;
|
||
|
|
||
|
cmsDoTransform(xform,
|
||
|
Image1.Picture.Bitmap.Scanline[i],
|
||
|
Image2.Picture.Bitmap.Scanline[i],
|
||
|
PicW);
|
||
|
|
||
|
end;
|
||
|
ProgressBar1.Position := PicH;
|
||
|
|
||
|
cmsDeleteTransform(xform);
|
||
|
cmsCloseProfile(hSrc);
|
||
|
cmsCloseProfile(hDest);
|
||
|
Image2.Repaint;
|
||
|
ProgressBar1.Position := 0;
|
||
|
end
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button3Click(Sender: TObject);
|
||
|
begin
|
||
|
if OpenDialog1.Execute then
|
||
|
ComboBoxInput.Text:=OpenDialog1.FileName;
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button4Click(Sender: TObject);
|
||
|
begin
|
||
|
if OpenDialog1.Execute then
|
||
|
ComboBoxOutput.Text:=OpenDialog1.FileName;
|
||
|
end;
|
||
|
|
||
|
end.
|