unit ads_Bitmap; {
}
interface
Uses Windows,Graphics,SysUtils;
Function BitmapToGrayscale(
Bitmap : TBitmap
): Boolean; OverLoad;
Function BitmapToGrayscale(
BitmapSource: TBitmap;
BitmapOut : TBitmap
): Boolean; OverLoad;
Function BitmapToGrayscale(
BitmapSourceFile: String;
BitmapOutFile : String
): Boolean; OverLoad;
Function BitmapToGrayscale(
BitmapFile: String
): Boolean; OverLoad;
Function BitmapInvert(
BitmapSource: TBitmap;
BitmapOut : TBitmap
): Boolean; OverLoad;
Function BitmapInvert(
Bitmap : TBitmap
): Boolean; OverLoad;
Function BitmapInvert(
BitmapSourceFile: String;
BitmapOutFile : String
): Boolean; OverLoad;
Function BitmapInvert(
BitmapFile: String
): Boolean; OverLoad;
(* RotateBitmap_ads
Example:
procedure TForm1.Button1Click(Sender: TObject);
Var
Center : TPoint;
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Try
Center.y := (Image.Height div 2)+20;
Center.x := (Image.Width div 2)+0;
RotateBitmap_ads(
Image.Picture.Bitmap, //SourceBitmap : TBitmap;
Bitmap , //DestBitmap : TBitmap;
Center , //Center : TPoint;
Angle );//Angle : Extended): TBitmap;
Angle := Angle + 15;
Image2.Picture.Bitmap.Assign(Bitmap);
Finally
Bitmap.Free;
End;
end;
*)
Procedure RotateBitmap_ads(
SourceBitmap : TBitmap;
out DestBitmap : TBitmap;
Center : TPoint;
Angle : Double);
implementation
Uses JPEG;
Const PixelMax = 32768;
Type
pPixelArray = ^TPixelArray;
TPixelArray = Array[0..PixelMax-1] Of TRGBTriple;
Procedure RotateBitmap_ads(
SourceBitmap : TBitmap;
out DestBitmap : TBitmap;
Center : TPoint;
Angle : Double);
Var
cosRadians : Double;
inX : Integer;
inXOriginal : Integer;
inXPrime : Integer;
inXPrimeRotated : Integer;
inY : Integer;
inYOriginal : Integer;
inYPrime : Integer;
inYPrimeRotated : Integer;
OriginalRow : pPixelArray;
Radians : Double;
RotatedRow : pPixelArray;
sinRadians : Double;
begin
DestBitmap.Width := SourceBitmap.Width;
DestBitmap.Height := SourceBitmap.Height;
DestBitmap.PixelFormat := pf24bit;
Radians := -(Angle) * PI / 180;
sinRadians := Sin(Radians);
cosRadians := Cos(Radians);
For inX := DestBitmap.Height-1 Downto 0 Do
Begin
RotatedRow := DestBitmap.Scanline[inX];
inXPrime := 2*(inX - Center.y) + 1;
For inY := DestBitmap.Width-1 Downto 0 Do
Begin
inYPrime := 2*(inY - Center.x) + 1;
inYPrimeRotated := Round(inYPrime * CosRadians - inXPrime * sinRadians);
inXPrimeRotated := Round(inYPrime * sinRadians + inXPrime * cosRadians);
inYOriginal := (inYPrimeRotated - 1) Div 2 + Center.x;
inXOriginal := (inXPrimeRotated - 1) Div 2 + Center.y;
If
(inYOriginal >= 0) And
(inYOriginal <= SourceBitmap.Width-1) And
(inXOriginal >= 0) And
(inXOriginal <= SourceBitmap.Height-1)
Then
Begin
OriginalRow := SourceBitmap.Scanline[inXOriginal];
RotatedRow[inY] := OriginalRow[inYOriginal]
End
Else
Begin
RotatedRow[inY].rgbtBlue := 255;
RotatedRow[inY].rgbtGreen := 0;
RotatedRow[inY].rgbtRed := 0
End;
End;
End;
End;
Function BitmapInvert(
BitmapSource: TBitmap;
BitmapOut : TBitmap
): Boolean;
var
BytesPorScan: integer;
inWidth : integer;
inHeight : integer;
p : pByteArray;
Bitmap : TBitmap;
Begin
Result := False;
If not (BitmapSource.PixelFormat in [pf15Bit, pf24Bit, pf32Bit]) Then Exit;
Bitmap := TBitmap.Create();
Try
Bitmap.Assign(BitmapSource);
Try
BytesPorScan :=
Abs(Integer(Bitmap.ScanLine[1])-Integer(Bitmap.ScanLine[0]));
Except
Result := False;
Exit;
End;
For inHeight := 0 To Bitmap.Height - 1 Do
Begin
P := Bitmap.ScanLine[InHeight];
For inWidth := 0 To BytesPorScan - 1 Do
Begin
P^[inWidth] := 255-P^[inWidth];
End;
End;
BitmapOut.Assign(Bitmap);
Result := True;
Finally
Bitmap.Free;
End;
end;
Function BitmapInvert(
BitmapSourceFile: String;
BitmapOutFile : String
): Boolean; OverLoad;
Var
BitmapSource: TBitmap;
BitmapOut : TBitmap;
Begin
Result := False;
Try
If Not FileExists(BitmapSourceFile) Then Exit;
BitmapSource:= TBitmap.Create();
BitmapOut := TBitmap.Create();
Try
BitmapSource.LoadFromFile(BitmapSourceFile);
Result :=
BitmapInvert(
BitmapSource, //BitmapSource: TBitmap;
BitmapOut //BitmapOut : TBitmap
);//): Boolean;
If Result Then
Begin
If FileExists(BitmapOutFile) Then DeleteFile(BitmapOutFile);
BitmapOut.SaveToFile(BitmapOutFile);
End;
Finally
BitmapSource.Free;
BitmapOut .Free;
End;
Except
Result := False;
End;
End;
Function BitmapInvert(
BitmapFile: String
): Boolean; OverLoad;
Begin
Result :=
BitmapInvert(
BitmapFile, //BitmapSourceFile: String;
BitmapFile //BitmapOutFile : String;
);//): Boolean; OverLoad;
End;
Function BitmapInvert(
Bitmap : TBitmap
): Boolean; OverLoad;
Begin
Result :=
BitmapInvert(
Bitmap, //BitmapSource: TBitmap;
Bitmap //BitmapOut : TBitmap
);//): Boolean;
End;
Function BitmapToGrayscale(
Bitmap : TBitmap
): Boolean;
Var
Jpeg : TJPEGImage;
Begin
Result := False;
If Bitmap = nil Then Exit;
Try
Jpeg := TJPEGImage.Create();
Try
Jpeg.Assign(Bitmap);
Jpeg.CompressionQuality := 100;
Jpeg.Compress;
Jpeg.Grayscale := True;
Bitmap.Canvas.Draw(0, 0, Jpeg);
Result := True;
Finally
Jpeg.Free;
End;
Except
Result := False;
End;
End;
Function BitmapToGrayscale(
BitmapSource: TBitmap;
BitmapOut : TBitmap
): Boolean; OverLoad;
Var
Bitmap : TBitmap;
Begin
Bitmap := TBitmap.Create();
Try
Result := BitmapToGrayscale(Bitmap);
If Result Then BitmapOut.Assign(Bitmap);
Finally
Bitmap.Free;
End;
End;
Function BitmapToGrayscale(
BitmapSourceFile: String;
BitmapOutFile : String
): Boolean; OverLoad;
Var
Bitmap : TBitmap;
Begin
Result := False;
Try
If Not FileExists(BitmapSourceFile) Then Exit;
Bitmap := TBitmap.Create();
Try
Bitmap.LoadFromFile(BitmapSourceFile);
Result := BitmapToGrayscale(Bitmap);
If Result Then
Begin
If FileExists(BitmapOutFile) Then DeleteFile(BitmapOutFile);
Bitmap.SaveToFile(BitmapOutFile);
End;
Finally
Bitmap.Free;
End;
Except
Result := False;
End;
End;
Function BitmapToGrayscale(
BitmapFile: String
): Boolean; OverLoad;
Begin
Result :=
BitmapToGrayscale(
BitmapFile, //BitmapSourceFile: String;
BitmapFile //BitmapOutFile : String
);//): Boolean; OverLoad;
End;
end.
//