📄 bmpreplace.pas
字号:
DPos: Integer;
CRead: Integer;
Size: Longint;
i,j: Integer;
DByte: Byte;
Cancel: Boolean;
begin
Cancel:=False;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',7);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
DStream:=TMemoryStream.Create;
// get size
ImgData.Seek(0,soFromBeginning);
ImgData.Read(CBuffer,24);
Size:=0;
for i:=0 to 2 do begin
for j:=7 downto 0 do begin
Size:=Size+(((CBuffer[(i*8)+(7-j)] and 1) shl j)*(1 shl (8*i)));
end;
end;
CRead:=ImgData.Read(CBuffer,1024);
DPos:=0;
CPos:=0;
j:=7;
DByte:=0;
for i:=0 to Size*8 do begin
if Cancel then break;
DByte:=DByte+((CBuffer[CPos] and 1) shl j);
if j>0 then Dec(j) else begin
j:=7;
DBuffer[DPos]:=DByte;
DByte:=0;
if DPos<1023 then Inc(DPos)
else begin
DStream.Write(DBuffer,DPos+1);
DPos:=0;
end;
end;
if CPos<CRead-1 then Inc(CPos)
else begin
CRead:=ImgData.Read(CBuffer,1024);
CPos:=0;
end;
if CRead=0 then break;
Percent:=Trunc(i/(Size*8));
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
DStream.Write(DBuffer,DPos);
ResultFile.LoadFromStream(DStream);
DStream.Free;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Decode24:=True;
end;
function TBMPReplace.Encode8(ToHide: TDataFile): Boolean;
var
CBuffer: Array[0..1023] of Byte;
DBuffer: Array[0..1023] of Byte;
CRead: Integer;
CPos: Integer;
DStream: TStream;
DRead: Integer;
DPos: Integer;
i, j: Integer;
Modified: TStream;
ht: TPaletteHashTable;
p: Integer;
Cancel: Boolean;
begin
ht:=CreateNewPalette;
Cancel:=False;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',8);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
biHeader.ClrUsed:=256;
bfHeader.Offset:=54+1024;
ImgData.Seek(0,soFromBeginning);
Modified:=TMemoryStream.Create;
CRead:=1024;
DStream:=TMemoryStream.Create;
ToHide.SaveToStream(DStream);
DStream.Seek(0,soFromBeginning);
DRead:=DStream.Read(DBuffer,1024);
DPos:=0;
j:=7;
p:=Trunc(ImgData.Size/1024);
while (CRead=1024) and not(Cancel) do begin
CRead:=ImgData.Read(CBuffer,1024);
for i:=0 to CRead-1 do begin
CBuffer[i]:=ht[CBuffer[i]];
if DRead>0 then
if (DBuffer[DPos] and (1 shl j))<>0 then Inc(CBuffer[i]);
if j>0 then Dec(j)
else begin
j:=7;
if DPos<DRead-1 then Inc(DPos)
else begin
if DRead=1024 then DRead:=DStream.Read(DBuffer,1024)
else DRead:=0;
DPos:=0;
end;
end;
end;
Modified.Write(CBuffer,CRead);
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
ImgData.Free;
ImgData:=Modified;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Encode8:=True;
end;
function TBMPReplace.Decode8(ResultFile: TDataFile): Boolean;
var
DBuffer: Array[0..1023] of Byte;
CBuffer: Array[0..1023] of Byte;
DStream: TMemoryStream;
CPos: Integer;
DPos: Integer;
CRead: Integer;
Size: Longint;
i,j: Integer;
DByte: Byte;
Cancel: Boolean;
begin
Cancel:=False;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',9);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
DStream:=TMemoryStream.Create;
// get size
ImgData.Seek(0,soFromBeginning);
ImgData.Read(CBuffer,24);
Size:=0;
for i:=0 to 2 do begin
for j:=7 downto 0 do begin
Size:=Size+(((CBuffer[(i*8)+(7-j)] and 1) shl j)*(1 shl (8*i)));
end;
end;
CRead:=ImgData.Read(CBuffer,1024);
DPos:=0;
CPos:=0;
j:=7;
DByte:=0;
for i:=0 to Size*8 do begin
if Cancel then break;
DByte:=DByte+((CBuffer[CPos] and 1) shl j);
if j>0 then Dec(j) else begin
j:=7;
DBuffer[DPos]:=DByte;
DByte:=0;
if DPos<1023 then Inc(DPos)
else begin
DStream.Write(DBuffer,DPos+1);
DPos:=0;
end;
end;
if CPos<CRead-1 then Inc(CPos)
else begin
CRead:=ImgData.Read(CBuffer,1024);
CPos:=0;
end;
if CRead=0 then break;
Percent:=Trunc(i/(Size*8));
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
DStream.Write(DBuffer,DPos);
ResultFile.LoadFromStream(DStream);
DStream.Free;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Decode8:=True;
end;
function TBMPReplace.Encode4(ToHide: TDataFile): Boolean;
var
CBuffer: Array[0..1023] of Byte;
DBuffer: Array[0..1023] of Byte;
CRead: Integer;
CPos: Integer;
DStream: TStream;
DRead: Integer;
DPos: Integer;
i, j: Integer;
Modified: TStream;
ht: TPaletteHashTable;
p: Integer;
Cancel: Boolean;
begin
Cancel:=False;
ht:=CreateNewPalette;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',10);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
biHeader.ClrUsed:=16;
bfHeader.Offset:=54+64;
ImgData.Seek(0,soFromBeginning);
Modified:=TMemoryStream.Create;
CRead:=1024;
DStream:=TMemoryStream.Create;
ToHide.SaveToStream(DStream);
DStream.Seek(0,soFromBeginning);
DRead:=DStream.Read(DBuffer,1024);
DPos:=0;
j:=3;
p:=Trunc(ImgData.Size/1024);
while (CRead=1024) and not(Cancel) do begin
CRead:=ImgData.Read(CBuffer,1024);
for i:=0 to CRead-1 do begin
CBuffer[i]:=((ht[(CBuffer[i] and $F0) shr 4]) shl 4)+ht[CBuffer[i] and $0F];
if DRead>0 then begin
if (DBuffer[DPos] and (1 shl (2*j+1)))<>0 then Inc(CBuffer[i],16);
if (DBuffer[DPos] and (1 shl (2*j)))<>0 then Inc(CBuffer[i],1);
end;
if j>0 then Dec(j)
else begin
j:=3;
if DPos<DRead-1 then Inc(DPos)
else begin
if DRead=1024 then DRead:=DStream.Read(DBuffer,1024)
else DRead:=0;
DPos:=0;
end;
end;
end;
Modified.Write(CBuffer,CRead);
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
ImgData.Free;
ImgData:=Modified;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Encode4:=True;
end;
function TBMPReplace.Decode4(ResultFile: TDataFile): Boolean;
var
DBuffer: Array[0..1023] of Byte;
CBuffer: Array[0..1023] of Byte;
DStream: TMemoryStream;
CPos: Integer;
DPos: Integer;
CRead: Integer;
Size: Longint;
i,j: Integer;
DByte: Byte;
Cancel: Boolean;
begin
Cancel:=False;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',11);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
DStream:=TMemoryStream.Create;
// get size
ImgData.Seek(0,soFromBeginning);
ImgData.Read(CBuffer,12);
Size:=0;
for i:=0 to 2 do begin
for j:=3 downto 0 do begin
Size:=Size+((((CBuffer[(i*4)+(3-j)] and $10) shr 4) shl (2*j+1))*(1 shl (8*i)));
Size:=Size+(((CBuffer[(i*4)+(3-j)] and 1) shl (2*j))*(1 shl (8*i)));
end;
end;
CRead:=ImgData.Read(CBuffer,1024);
DPos:=0;
CPos:=0;
j:=3;
DByte:=0;
for i:=0 to Size*4 do begin
if Cancel then break;
DByte:=DByte+(((CBuffer[CPos] and $10) shr 4) shl (2*j+1));
DByte:=DByte+((CBuffer[CPos] and 1) shl (2*j));
if j>0 then Dec(j) else begin
j:=3;
DBuffer[DPos]:=DByte;
DByte:=0;
if DPos<1023 then Inc(DPos)
else begin
DStream.Write(DBuffer,DPos+1);
DPos:=0;
end;
end;
if CPos<CRead-1 then Inc(CPos)
else begin
CRead:=ImgData.Read(CBuffer,1024);
CPos:=0;
end;
if CRead=0 then break;
Percent:=Trunc(i/(Size*4));
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
DStream.Write(DBuffer,DPos);
ResultFile.LoadFromStream(DStream);
DStream.Free;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Decode4:=True;
end;
function TBMPReplace.Encode8RLE(ToHide: TDataFile): Boolean;
var
CBuffer: Array[0..1023] of Byte;
DBuffer: Array[0..1023] of Byte;
CRead: Integer;
CPos: Integer;
DStream: TStream;
DRead: Integer;
DPos: Integer;
i, j: Integer;
Modified: TStream;
ht: TPaletteHashTable;
Skip: Integer;
Col: Integer;
ESC: Boolean;
p: Integer;
Cancel: Boolean;
begin
Cancel:=False;
ht:=CreateNewPalette;
Percent:=0;
Action:=ml.GetCodeString('BMPReplace',12);
if Assigned(FActionChange) then FActionChange(self,Action);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
biHeader.ClrUsed:=256;
bfHeader.Offset:=54+1024;
ImgData.Seek(0,soFromBeginning);
Modified:=TMemoryStream.Create;
CRead:=1024;
DStream:=TMemoryStream.Create;
ToHide.SaveToStream(DStream);
DStream.Seek(0,soFromBeginning);
DRead:=DStream.Read(DBuffer,1024);
DPos:=0;
j:=7;
ESC:=False;
Skip:=0;
Col:=0;
p:=Trunc(ImgData.Size/1024);
while (CRead=1024) and not(Cancel) do begin
CRead:=ImgData.Read(CBuffer,1024);
for i:=0 to CRead-1 do begin
if Skip>0 then begin
Dec(Skip);
if Col>0 then begin
// encode
CBuffer[i]:=ht[CBuffer[i]];
if DRead=1024 then
if (DBuffer[DPos] and (1 shl j))<>0 then Inc(CBuffer[i]);
if j>0 then Dec(j)
else begin
j:=7;
if DPos<DRead-1 then Inc(DPos)
else begin
if DRead=1024 then DRead:=DStream.Read(DBuffer,1024)
else DRead:=0;
DPos:=0;
end;
end;
// -------
Dec(Col);
end;
end
else begin
Col:=0;
if not(ESC) then begin
if CBuffer[i]=0 then ESC:=True
else begin
Skip:=1;
Col:=1;
end;
end
else begin
ESC:=False;
if CBuffer[i]=2 then begin
Skip:=2;
Col:=0;
end;
if CBuffer[i]>2 then begin
Col:=CBuffer[i];
if (CBuffer[i] mod 2)>0 then Skip:=CBuffer[i]+1
else Skip:=CBuffer[i];
end;
end;
end;
end;
Modified.Write(CBuffer,CRead);
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
ImgData.Free;
ImgData:=Modified;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Encode8RLE:=True;
end;
function TBMPReplace.Decode8RLE(ResultFile: TDataFile): Boolean;
var
DBuffer: Array[0..1023] of Byte;
CBuffer: Array[0..1023] of Byte;
DStream: TMemoryStream;
CPos: Integer;
DPos: Integer;
CRead: Integer;
Size: Longint;
i,j: Integer;
DByte: Byte;
S24: Array[0..2] of Byte;
Skip: Integer;
Col: Integer;
ESC: Boolean;
Cancel: Boolean;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -