Скачал библиотеку FreeImage, из приложенного ImagePreview переделал процедуру чтения картинки с поддержкой призрачности:
Код HTML:
procedure TForm1.LoadImage( Name : string);
var
dib:PFIBITMAP;
t:FREE_IMAGE_FORMAT;
Ext:string;
BM:TBitmap;
x,y:integer;
BP:PLONGWORD;
DC:HDC;
BPP:longword;
begin
if (not OpenDialog.Execute) then
abort;
Image32.Bitmap.Clear;
Name:=OpenDialog.FileName;
t:=FreeImage_GetFileType(PAnsiChar(Name), 16);
if t=FIF_UNKNOWN then begin
Ext:=UpperCase(ExtractFileExt(Name));
if (Ext='.TGA')or(Ext='.TARGA') then
t:=FIF_TARGA
else if Ext='.MNG' then
t:=FIF_MNG
else if Ext='.PCD' then
t:=FIF_PCD
else if Ext='.WBMP' then
t:=FIF_WBMP
else if Ext='.CUT' then
t:=FIF_CUT
else
raise Exception.Create('Файл "'+Name+'" имеет неподдерживаемый формат.');
end;
dib:=FreeImage_Load(t,PAnsiChar(name), 0);
if Dib=nil then
abort;
BPP:=FreeImage_GetBPP(dib);
if BPP=32 then begin
Image32.Bitmap.SetSize(FreeImage_GetWidth(dib), FreeImage_GetHeight(dib));
BP:=PLONGWORD(FreeImage_GetBits(dib));
for y:=Image32.Bitmap.Height-1 downto 0 do
for x:=0 to Image32.Bitmap.Width-1 do begin
Image32.Bitmap.Pixel[x,y]:=BP^;
inc(BP);
end;
end else begin
BM:=TBitmap.Create;
DC:=GetDC(Handle);
BM.handle:=CreateDIBitmap(DC, FreeImage_GetInfoHeader(dib)^,
CBM_INIT, PChar(FreeImage_GetBits(dib)),
FreeImage_GetInfo(dib)^, DIB_RGB_COLORS);
Image32.Bitmap.Assign(BM);
Alpha32.Bitmap.Assign(BM);
BM.Free;
ReleaseDC(Handle, DC);
end;
if BPP=32 then
Image32.Bitmap.DrawMode:=dmBlend
else Image32.Bitmap.DrawMode := dmOpaque;
FreeImage_Unload(dib);
end;
с помощью MultiBitmap пробывал открывать tif - показывает только 1 слой - всю картинку, хотя фотошоп показывает 4 слоя.
Вопрос: можно ли её как-то уменьшить (но чтобы прозрачность осталась) и можно ли из tif и psd извлечь только один, конкретный, слой (также с поддержкой прозрачности)?