⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpreplace.pas

📁 wbs43open-src.zip 数字隐藏工具
💻 PAS
📖 第 1 页 / 共 3 页
字号:
     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 + -