344 lines
9.4 KiB
ObjectPascal
Raw Normal View History

2026-07-11 15:55:22 +08:00
unit umodify;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Spin;
type
TForm3 = class(TForm)
Label1: TLabel;
Label2: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Bevel1: TBevel;
ScrollBox1: TScrollBox;
Label3: TLabel;
SpinEdit3: TSpinEdit;
OpenDialog1: TOpenDialog;
Button5: TButton;
Button6: TButton;
SaveDialog1: TSaveDialog;
Label4: TLabel;
Edit1: TEdit;
Image1: TImage;
procedure Button2Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure makegrid(w, h: integer);
procedure Button4Click(Sender: TObject);
procedure streamToBmp(Stream: TStream; const Width, Height,
ColorDepth, OffBits: Integer; Bmp: TBitmap);
procedure Button1Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
id, dw, dh: integer;
mbmp: tbitmap;
uclear: boolean;
PRowCount, PColCount, cellwidth, cellheight: integer;
end;
var
Form3: TForm3;
implementation
uses umain;
{$R *.dfm}
procedure TForm3.Button2Click(Sender: TObject);
begin
CLOSE;
end;
procedure TForm3.SpinEdit1Change(Sender: TObject);
begin
if SpinEdit1.Value = 0 then
Image1.Visible := false else
begin
PColCount := SpinEdit1.Value;
mbmp.Width := SpinEdit1.Value;
if Form3.Showing then
makegrid(SpinEdit1.Value, SpinEdit2.Value);
end;
end;
procedure TForm3.SpinEdit2Change(Sender: TObject);
begin
if SpinEdit2.Value = 0 then
Image1.Visible := false else
begin
pRowCount := SpinEdit2.Value;
mbmp.Height := SpinEdit2.Value;
if Form3.Showing then
makegrid(SpinEdit1.Value, SpinEdit2.Value);
end;
end;
procedure TForm3.Button3Click(Sender: TObject);
var
ms: TMemoryStream;
FileHeader: TBitmapFileHeader;
InfoHeader: TBitmapInfoHeader;
tmpBmp: tbitmap;
begin
if OpenDialog1.Execute then
begin
uclear := true;
ms := TMemoryStream.Create;
tmpBmp := TBitmap.Create;
tmpBmp.PixelFormat := pf24bit;
tmpBmp.Canvas.Lock;
ms.LoadFromFile(OpenDialog1.FileName);
ms.Read(FileHeader, SizeOf(TBitmapFileHeader));
ms.Read(InfoHeader, SizeOf(TBitmapInfoHeader));
tmpBmp.Width := InfoHeader.biWidth;
tmpBmp.Height := InfoHeader.biheight;
tmpBmp.Canvas.Brush.Color := clBlack;
tmpBmp.Canvas.FillRect(Rect(0, 0, tmpBmp.Width, tmpBmp.Height));
streamToBmp(ms, tmpBmp.Width, tmpBmp.height, InfoHeader.biBitCount, FileHeader.bfOffBits, tmpBmp);
mbmp.Width := SpinEdit1.Value;
mbmp.Height := SpinEdit2.Value;
mbmp.Canvas.Lock;
mbmp.Canvas.Brush.Color := clBlack;
mbmp.Canvas.FillRect(Rect(0, 0, mbmp.Width, mbmp.Height));
mbmp.Canvas.StretchDraw(Rect(0, 0, mbmp.Width, mbmp.Height), tmpBmp);
mbmp.Canvas.Unlock;
tmpBmp.Canvas.Unlock;
FreeAndNil(tmpBmp);
FreeAndNil(ms);
makegrid(SpinEdit1.Value, SpinEdit2.Value);
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
mbmp := TBitmap.Create;
mbmp.PixelFormat := pf24bit;
uclear := false;
end;
procedure TForm3.FormShow(Sender: TObject);
begin
if Form1.editmode = 1 then
begin
makegrid(Form1.fontlist[SpinEdit3.Value].width,
Form1.fontlist[SpinEdit3.Value].height);
end else if Form1.editmode = 2 then
begin
makegrid(Form1.bitmaplist[SpinEdit3.Value].width,
Form1.bitmaplist[SpinEdit3.Value].height);
end;
end;
procedure TForm3.Button5Click(Sender: TObject);
begin
uclear := false;
SpinEdit1.Value := dw;
SpinEdit2.Value := dh;
makegrid(dw, dh);
end;
procedure TForm3.makegrid(w, h: integer);
var
i, j, x, y: integer;
p: PByteArray;
Frame: trect;
bmp: tbitmap;
r,g:byte;
begin
if uclear = false then
begin
mbmp.Width := w;
mbmp.height := h;
mbmp.Canvas.Brush.Color := clblack;
mbmp.Canvas.FillRect(rect(0, 0, mbmp.Width, mbmp.height));
if form1.editmode = 1 then
mbmp.Canvas.Draw(0, 0, Form1.fontlist[SpinEdit3.Value].bmplist) else
if form1.editmode = 2 then
mbmp.Canvas.Draw(0, 0, Form1.bitmaplist[SpinEdit3.Value].bmplist);
end;
Image1.Visible := true;
//<2F><><EFBFBD><EFBFBD>paintbox <20>ֿ<EFBFBD><D6BF><EFBFBD>ʾ
Image1.Width := w * form1.pixelsrule + 1;
Image1.height := h * form1.pixelsrule + 1;
bmp := TBitmap.Create;
bmp.PixelFormat := pf24bit;
bmp.Width := Image1.Width;
bmp.height := Image1.height;
bmp.Canvas.Brush.Color := rgb(64, 64, 64);
bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.height));
PColCount := w;
PRowCount := h;
// Calculate grid cell size
CellWidth := form1.pixelsrule;
CellHeight := form1.pixelsrule;
y := 0;
for i := 0 to mbmp.height - 1 do
begin
p := mbmp.ScanLine[i];
x := 0;
for j := 0 to mbmp.Width - 1 do
begin
Frame.Left := x;
Frame.Right := x + CellWidth;
Frame.Top := y;
Frame.Bottom := y + CellHeight;
DrawEdge(bmp.Canvas.Handle, Frame, BDR_SUNKENINNER, BF_ADJUST or BF_LEFT);
DrawEdge(bmp.Canvas.Handle, Frame, BDR_SUNKENINNER, BF_ADJUST or BF_top);
if p[j * 3 + 2]>=128 then
r:=255 else r:=0;
if p[j * 3 + 1]>=128 then
g:=255 else g:=0;
bmp.Canvas.Brush.Color := rgb(r, g, 0);
bmp.Canvas.FillRect(Frame);
inc(x, CellWidth);
end;
inc(y, CellHeight);
end;
Image1.Picture.Bitmap := bmp;
bmp.Free;
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
uclear := true;
mbmp.Width := SpinEdit1.Value;
mbmp.height := SpinEdit2.Value;
mbmp.Canvas.Brush.Color := clblack;
mbmp.Canvas.FillRect(rect(0, 0, mbmp.Width, mbmp.height));
makegrid(SpinEdit1.Value, SpinEdit2.Value);
end;
procedure TForm3.streamToBmp(Stream: TStream; const Width, Height,
ColorDepth, OffBits: Integer; Bmp: TBitmap);
var
RemLen, DataLen, i: Integer;
begin
case ColorDepth of
1:
begin
Bmp.PixelFormat := pf1Bit;
DataLen := (Width + 7) shr 3;
end;
4:
begin
Bmp.PixelFormat := pf4Bit;
DataLen := (Width + 1) shr 1;
end;
8:
begin
Bmp.PixelFormat := pf8Bit;
DataLen := Width;
end;
15:
begin
Bmp.PixelFormat := pf15Bit;
DataLen := Width shl 1;
end;
16:
begin
Bmp.PixelFormat := pf16Bit;
DataLen := Width shl 1;
end;
24:
begin
Bmp.PixelFormat := pf24Bit;
DataLen := Width shl 1 + Width;
end;
32:
begin
Bmp.PixelFormat := pf32Bit;
DataLen := Width shl 2;
end;
end;
Bmp.Width := Width;
Bmp.Height := Height;
RemLen := (DataLen + 3) shr 2 shl 2; //- DataLen;
for i := 0 to Height - 1 do
begin
Stream.Position := OffBits + RemLen * (Height - 1 - i);
Stream.Read(Bmp.ScanLine[i]^, DataLen);
end;
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
if Form1.editmode = 1 then
begin
if MessageBox(Application.Handle, 'Do You Want to Modify Selected Font?', 'Modify Hint', MB_OKCANCEL + MB_ICONINFORMATION) = MrOK then
begin
Form1.AdvStringGrid2.Cells[2, id + 1] := inttostr(id);
Form1.AdvStringGrid2.Cells[3, id + 1] := inttostr(SpinEdit1.Value);
Form1.AdvStringGrid2.Cells[4, id + 1] := inttostr(SpinEdit2.Value);
Form1.fontlist[id].width := SpinEdit1.Value;
Form1.fontlist[id].height := SpinEdit2.Value;
if Form1.fontlist[id].bmplist <> nil then
Form1.fontlist[id].bmplist.Free;
Form1.fontlist[id].bmplist := TBitmap.Create;
Form1.fontlist[id].bmplist.PixelFormat := pf24bit;
Form1.fontlist[id].bmplist.Width := SpinEdit1.Value;
Form1.fontlist[id].bmplist.height := SpinEdit2.Value;
Form1.fontlist[id].bmplist.Canvas.Brush.Color := clBlack;
Form1.fontlist[id].bmplist.Canvas.FillRect(Rect(0, 0, SpinEdit1.Value, SpinEdit2.Value));
Form1.fontlist[id].bmplist.Canvas.Draw(0, 0, mbmp);
Form1.AdvStringGrid2Click(sender);
close;
end;
end else if Form1.editmode = 2 then
begin
if MessageBox(Application.Handle, 'Do You Want to Modify Selected Bitmwp?', 'Modify Hint', MB_OKCANCEL + MB_ICONINFORMATION) = MrOK then
begin
Form1.AdvStringGrid2.Cells[2, id + 1] := edit1.Text;
Form1.AdvStringGrid2.Cells[3, id + 1] := inttostr(SpinEdit1.Value);
Form1.AdvStringGrid2.Cells[4, id + 1] := inttostr(SpinEdit2.Value);
Form1.bitmaplist[id].width := SpinEdit1.Value;
Form1.bitmaplist[id].height := SpinEdit2.Value;
if Form1.bitmaplist[id].bmplist <> nil then
Form1.bitmaplist[id].bmplist.Free;
Form1.bitmaplist[id].bmplist := TBitmap.Create;
Form1.bitmaplist[id].bmplist.PixelFormat := pf24bit;
Form1.bitmaplist[id].bmplist.Width := SpinEdit1.Value;
Form1.bitmaplist[id].bmplist.height := SpinEdit2.Value;
Form1.bitmaplist[id].bmplist.Canvas.Brush.Color := clBlack;
Form1.bitmaplist[id].bmplist.Canvas.FillRect(Rect(0, 0, SpinEdit1.Value, SpinEdit2.Value));
Form1.bitmaplist[id].bmplist.Canvas.Draw(0, 0, mbmp);
Form1.AdvStringGrid2Click(sender);
close;
end;
end;
end;
procedure TForm3.Button6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
mbmp.SaveToFile(SaveDialog1.FileName);
end;
end.