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

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.