📄 freebitmap.pas
字号:
Result := Replace(dib4);
end;
end;
function TFreeBitmap.ConvertTo8Bits: Boolean;
var
dib8: PFIBITMAP;
begin
if FDib <> nil then
begin
dib8 := FreeImage_ConvertTo8Bits(FDib);
Result := Replace(dib8);
end
else
Result := False
end;
function TFreeBitmap.ConvertToGrayscale: Boolean;
var
dib8: PFIBITMAP;
begin
Result := False;
if IsValid then
begin
dib8 := FreeImage_ConvertToGreyscale(FDib);
Result := Replace(dib8);
end
end;
function TFreeBitmap.ConvertToRGBF: Boolean;
var
ImageType: FREE_IMAGE_TYPE;
NewDib: PFIBITMAP;
begin
Result := False;
if not IsValid then Exit;
ImageType := GetImageType;
if (ImageType = FIT_BITMAP) then
begin
if GetBitsPerPixel < 24 then
if not ConvertTo24Bits then
Exit
end;
NewDib := FreeImage_ConvertToRGBF(FDib);
Result := Replace(NewDib);
end;
function TFreeBitmap.ConvertToStandardType(ScaleLinear: Boolean): Boolean;
var
dibStandard: PFIBITMAP;
begin
if IsValid then
begin
dibStandard := FreeImage_ConvertToStandardType(FDib, ScaleLinear);
Result := Replace(dibStandard);
end
else
Result := False;
end;
function TFreeBitmap.ConvertToType(ImageType: FREE_IMAGE_TYPE;
ScaleLinear: Boolean): Boolean;
var
dib: PFIBITMAP;
begin
if FDib <> nil then
begin
dib := FreeImage_ConvertToType(FDib, ImageType, ScaleLinear);
Result := Replace(dib)
end
else
Result := False
end;
function TFreeBitmap.CopySubImage(Left, Top, Right, Bottom: Integer;
Dest: TFreeBitmap): Boolean;
begin
if FDib <> nil then
begin
Dest.FDib := FreeImage_Copy(FDib, Left, Top, Right, Bottom);
Result := Dest.IsValid;
end else
Result := False;
end;
constructor TFreeBitmap.Create(ImageType: FREE_IMAGE_TYPE; Width, Height,
Bpp: Integer);
begin
inherited Create;
FDib := nil;
if (Width > 0) and (Height > 0) and (Bpp > 0) then
SetSize(ImageType, Width, Height, Bpp);
end;
destructor TFreeBitmap.Destroy;
begin
if FDib <> nil then
FreeImage_Unload(FDib);
inherited;
end;
function TFreeBitmap.Dither(Algorithm: FREE_IMAGE_DITHER): Boolean;
var
dib: PFIBITMAP;
begin
if FDib <> nil then
begin
dib := FreeImage_Dither(FDib, Algorithm);
Result := Replace(dib);
end
else
Result := False;
end;
function TFreeBitmap.DoChanging(var OldDib, NewDib: PFIBITMAP): Boolean;
begin
Result := False;
if (OldDib <> NewDib) and Assigned(FOnChanging) then
FOnChanging(Self, OldDib, NewDib, Result);
end;
procedure TFreeBitmap.FindCloseMetadata(MDHandle: PFIMETADATA);
begin
FreeImage_FindCloseMetadata(MDHandle);
end;
function TFreeBitmap.FindFirstMetadata(Model: FREE_IMAGE_MDMODEL;
var Tag: TFreeTag): PFIMETADATA;
begin
Result := FreeImage_FindFirstMetadata(Model, FDib, Tag.FTag);
end;
function TFreeBitmap.FindNextMetadata(MDHandle: PFIMETADATA;
var Tag: TFreeTag): Boolean;
begin
Result := FreeImage_FindNextMetadata(MDHandle, Tag.FTag);
end;
function TFreeBitmap.FlipHorizontal: Boolean;
begin
if FDib <> nil then
begin
Result := FreeImage_FlipHorizontal(FDib);
Change;
end
else
Result := False
end;
function TFreeBitmap.FlipVertical: Boolean;
begin
if FDib <> nil then
begin
Result := FreeImage_FlipVertical(FDib);
Change;
end
else
Result := False
end;
function TFreeBitmap.GetBitsPerPixel: Integer;
begin
Result := FreeImage_GetBPP(FDib)
end;
function TFreeBitmap.GetChannel(Bitmap: TFreeBitmap;
Channel: FREE_IMAGE_COLOR_CHANNEL): Boolean;
begin
if FDib <> nil then
begin
Bitmap.Dib := FreeImage_GetChannel(FDib, Channel);
Result := Bitmap.IsValid;
end
else
Result := False
end;
function TFreeBitmap.GetColorsUsed: Integer;
begin
Result := FreeImage_GetColorsUsed(FDib)
end;
function TFreeBitmap.GetColorType: FREE_IMAGE_COLOR_TYPE;
begin
Result := FreeImage_GetColorType(FDib);
end;
function TFreeBitmap.GetFileBkColor(var BkColor: PRGBQuad): Boolean;
begin
Result := FreeImage_GetBackgroundColor(FDib, BkColor)
end;
function TFreeBitmap.GetHeight: Integer;
begin
Result := FreeImage_GetHeight(FDib)
end;
function TFreeBitmap.GetHistogram(Histo: PDWORD;
Channel: FREE_IMAGE_COLOR_CHANNEL): Boolean;
begin
if FDib <> nil then
Result := FreeImage_GetHistogram(FDib, Histo, Channel)
else
Result := False
end;
function TFreeBitmap.GetHorizontalResolution: Double;
begin
Result := FreeImage_GetDotsPerMeterX(FDib) / 100
end;
function TFreeBitmap.GetImageSize: Cardinal;
begin
Result := FreeImage_GetDIBSize(FDib);
end;
function TFreeBitmap.GetImageType: FREE_IMAGE_TYPE;
begin
Result := FreeImage_GetImageType(FDib);
end;
function TFreeBitmap.GetInfo: PBitmapInfo;
begin
Result := FreeImage_GetInfo(FDib^)
end;
function TFreeBitmap.GetInfoHeader: PBITMAPINFOHEADER;
begin
Result := FreeImage_GetInfoHeader(FDib)
end;
function TFreeBitmap.GetLine: Integer;
begin
Result := FreeImage_GetLine(FDib)
end;
function TFreeBitmap.GetMetadata(Model: FREE_IMAGE_MDMODEL;
const Key: string; var Tag: TFreeTag): Boolean;
begin
Result := FreeImage_GetMetaData(Model, FDib, PChar(Key), Tag.FTag);
end;
function TFreeBitmap.GetMetadataCount(Model: FREE_IMAGE_MDMODEL): Cardinal;
begin
Result := FreeImage_GetMetadataCount(Model, FDib);
end;
function TFreeBitmap.GetPalette: PRGBQUAD;
begin
Result := FreeImage_GetPalette(FDib)
end;
function TFreeBitmap.GetPaletteSize: Integer;
begin
Result := FreeImage_GetColorsUsed(FDib) * SizeOf(RGBQUAD)
end;
function TFreeBitmap.GetPixelColor(X, Y: Cardinal;
var Value: PRGBQUAD): Boolean;
begin
Result := FreeImage_GetPixelColor(FDib, X, Y, Value)
end;
function TFreeBitmap.GetPixelIndex(X, Y: Cardinal;
var Value: PByte): Boolean;
begin
Result := FreeImage_GetPixelIndex(FDib, X, Y, Value)
end;
function TFreeBitmap.GetScanLine(ScanLine: Integer): PByte;
var
H: Integer;
begin
H := FreeImage_GetHeight(FDib);
if ScanLine < H then
Result := FreeImage_GetScanLine(FDib, ScanLine)
else
Result := nil;
end;
function TFreeBitmap.GetScanWidth: Integer;
begin
Result := FreeImage_GetPitch(FDib)
end;
function TFreeBitmap.GetTransparencyCount: Cardinal;
begin
Result := FreeImage_GetTransparencyCount(FDib)
end;
function TFreeBitmap.GetTransparencyTable: PByte;
begin
Result := FreeImage_GetTransparencyTable(FDib)
end;
function TFreeBitmap.GetVerticalResolution: Double;
begin
Result := FreeImage_GetDotsPerMeterY(Fdib) / 100
end;
function TFreeBitmap.GetWidth: Integer;
begin
Result := FreeImage_GetWidth(FDib)
end;
function TFreeBitmap.HasFileBkColor: Boolean;
begin
Result := FreeImage_HasBackgroundColor(FDib)
end;
function TFreeBitmap.Invert: Boolean;
begin
if FDib <> nil then
begin
Result := FreeImage_Invert(FDib);
Change;
end
else
Result := False
end;
function TFreeBitmap.IsGrayScale: Boolean;
begin
Result := (FreeImage_GetBPP(FDib) = 8)
and (FreeImage_GetColorType(FDib) = FIC_PALETTE);
end;
function TFreeBitmap.IsTransparent: Boolean;
begin
Result := FreeImage_IsTransparent(FDib);
end;
function TFreeBitmap.IsValid: Boolean;
begin
Result := FDib <> nil
end;
function TFreeBitmap.Load(const FileName: string; Flag: Integer): Boolean;
var
fif: FREE_IMAGE_FORMAT;
begin
// check the file signature and get its format
fif := FreeImage_GetFileType(PChar(Filename), 0);
if fif = FIF_UNKNOWN then
// no signature?
// try to guess the file format from the file extention
fif := FreeImage_GetFIFFromFilename(PChar(FileName));
// check that the plugin has reading capabilities ...
if (fif <> FIF_UNKNOWN) and FreeImage_FIFSupportsReading(FIF) then
begin
// free the previous dib
if FDib <> nil then
FreeImage_Unload(dib);
// load the file
FDib := FreeImage_Load(fif, PChar(FileName), Flag);
Change;
Result := IsValid;
end else
Result := False;
end;
function TFreeBitmap.LoadFromHandle(IO: PFreeImageIO; Handle: fi_handle;
Flag: Integer): Boolean;
var
fif: FREE_IMAGE_FORMAT;
begin
// check the file signature and get its format
fif := FreeImage_GetFileTypeFromHandle(IO, Handle, 16);
if (fif <> FIF_UNKNOWN) and FreeImage_FIFSupportsReading(fif) then
begin
// free the previous dib
if FDib <> nil then
FreeImage_Unload(FDib);
// load the file
FDib := FreeImage_LoadFromHandle(fif, IO, Handle, Flag);
Change;
Result := IsValid;
end else
Result := False;
end;
function TFreeBitmap.LoadFromMemory(MemIO: TFreeMemoryIO;
Flag: Integer): Boolean;
var
fif: FREE_IMAGE_FORMAT;
begin
// check the file signature and get its format
fif := MemIO.GetFileType;
if (fif <> FIF_UNKNOWN) and FreeImage_FIFSupportsReading(fif) then
begin
// free the previous dib
if FDib <> nil then
FreeImage_Unload(FDib);
// load the file
FDib := MemIO.Read(fif, Flag);
Result := IsValid;
Change;
end else
Result := False;
end;
function TFreeBitmap.LoadFromStream(Stream: TStream;
Flag: Integer): Boolean;
var
MemIO: TFreeMemoryIO;
Data: PByte;
MemStream: TMemoryStream;
Size: Cardinal;
begin
Size := Stream.Size;
MemStream := TMemoryStream.Create;
try
MemStream.CopyFrom(Stream, Size);
Data := MemStream.Memory;
MemIO := TFreeMemoryIO.Create(Data, Size);
try
Result := LoadFromMemory(MemIO);
finally
MemIO.Free;
end;
finally
MemStream.Free;
end;
end;
function TFreeBitmap.LoadU(const FileName: WideString;
Flag: Integer): Boolean;
var
fif: FREE_IMAGE_FORMAT;
begin
// check the file signature and get its format
fif := FreeImage_GetFileTypeU(PWideChar(Filename), 0);
if fif = FIF_UNKNOWN then
// no signature?
// try to guess the file format from the file extention
fif := FreeImage_GetFIFFromFilenameU(PWideChar(FileName));
// check that the plugin has reading capabilities ...
if (fif <> FIF_UNKNOWN) and FreeImage_FIFSupportsReading(FIF) then
begin
// free the previous dib
if FDib <> nil then
FreeImage_Unload(dib);
// load the file
FDib := FreeImage_LoadU(fif, PWideChar(FileName), Flag);
Change;
Result := IsValid;
end else
Result := False;
end;
procedure TFreeBitmap.MakeThumbnail(const Width, Height: Integer;
DestBitmap: TFreeBitmap);
type
PRGB24 = ^TRGB24;
TRGB24 = packed record
B: Byte;
G: Byte;
R: Byte;
end;
var
x, y, ix, iy: integer;
x1, x2, x3: integer;
xscale, yscale: single;
iRed, iGrn, iBlu, iRatio: Longword;
p, c1, c2, c3, c4, c5: TRGB24;
pt, pt1: PRGB24;
iSrc, iDst, s1: integer;
i, j, r, g, b, tmpY: integer;
RowDest, RowSource, RowSourceStart: integer;
w, h: Integer;
dxmin, dymin: integer;
ny1, ny2, ny3: integer;
dx, dy: integer;
lutX, lutY: array of integer;
SrcBmp, DestBmp: PFIBITMAP;
begin
if not IsValid then Exit;
if (GetWidth <= ThumbSize) and (GetHeight <= ThumbSize) then
begin
DestBitmap.Assign(Self);
Exit;
end;
w := Width;
h := Height;
// prepare bitmaps
if GetBitsPerPixel <> 24 then
SrcBmp := FreeImage_ConvertTo24Bits(FDib)
else
SrcBmp := FDib;
DestBmp := FreeImage_Allocate(w, h, 24);
Assert(DestBmp <> nil, 'TFreeBitmap.MakeThumbnail error');
{ iDst := (w * 24 + 31) and not 31;
iDst := iDst div 8; //BytesPerScanline
iSrc := (GetWidth * 24 + 31) and not 31;
iSrc := iSrc div 8;
}
// BytesPerScanline
iDst := FreeImage_GetPitch(DestBmp);
iSrc := FreeImage_GetPitch(SrcBmp);
xscale := 1 / (w / FreeImage_GetWidth(SrcBmp));
yscale := 1 / (h / FreeImage_GetHeight(SrcBmp));
// X lookup table
SetLength(lutX, w);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -