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

📄 screencryptbmp.pas

📁 bmp文件的加密解密
💻 PAS
字号:
unit ScreenCryptBMP;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ExtDlgs;

type
  TFormCrypt = class(TForm)
    ButtonLoad: TButton;
    ImageOriginal: TImage;
    ImageEncrypted: TImage;
    ImageDecrypted: TImage;
    ButtonEncrypt: TButton;
    ButtonDecrypt: TButton;
    ButtonSave: TButton;
    EditSeedEncrypt: TEdit;
    LabelSeedEncrypt: TLabel;
    CheckBoxStretch: TCheckBox;
    SavePictureDialog: TSavePictureDialog;
    OpenPictureDialog: TOpenPictureDialog;
    LabelSeedDecrypt: TLabel;
    EditSeedDecrypt: TEdit;
    LabelLab1: TLabel;
    LabelLab2: TLabel;
    procedure FormDestroy(Sender: TObject);
    procedure ButtonLoadClick(Sender: TObject);
    procedure ButtonEncryptClick(Sender: TObject);
    procedure ButtonDecryptClick(Sender: TObject);
    procedure CheckBoxStretchClick(Sender: TObject);
    procedure EditSeedEncryptChange(Sender: TObject);
    procedure EditSeedDecryptChange(Sender: TObject);
    procedure LabelLab2Click(Sender: TObject);
    procedure EditNumericKeyPress(Sender: TObject; var Key: Char);
    procedure ButtonSaveClick(Sender: TObject);
  private
    BitmapOriginal :  TBitmap;
    BitmapEncrypted:  TBitmap;

    PROCEDURE DecryptImage;
    PROCEDURE EncryptImage;
  public
    { Public declarations }
  end;

var
  FormCrypt: TFormCrypt;

implementation
{$R *.DFM}

  USES
    ShellAPI;  // ShellExecute

    
  // Don't bother trying to understand structure of pixels within scanline.
  // Just find length of scanline in bytes and process all bytes.
  PROCEDURE TFormCrypt.EncryptImage;
    VAR
      i                :  INTEGER;
      j                :  INTEGER;
      RandomValue      :  BYTE;
      rowIn            :  pByteArray;
      rowOut           :  pByteArray;
      ScanlineByteCount:  INTEGER;
  BEGIN
    IF  Assigned(BitmapEncrypted)
    THEN BitmapEncrypted.Free;

    BitmapEncrypted             := TBitmap.Create;
    BitmapEncrypted.Width       := BitmapOriginal.Width;
    BitmapEncrypted.Height      := BitmapOriginal.Height;
    BitmapEncrypted.PixelFormat := BitmapOriginal.PixelFormat;

    // Copy palette if palettized image
    IF   BitmapOriginal.PixelFormat IN [pf1bit, pf4bit, pf8bit]
    THEN BitmapEncrypted.Palette := CopyPalette(BitmapOriginal.Palette);

    // This finds the number of bytes per scanline regardless of PixelFormat
    ScanlineByteCount := ABS(Integer(BitmapOriginal.Scanline[1]) -
                             Integer(BitmapOriginal.Scanline[0]));

    TRY
      RandSeed := StrToInt(EditSeedEncrypt.Text)
    EXCEPT
      RandSeed := 79997  // use this prime number if entry is invalid
    END;

    FOR j := 0 TO BitmapOriginal.Height-1 DO
    BEGIN
      RowIn  := BitmapOriginal.Scanline[j];
      RowOut := BitmapEncrypted.Scanline[j];

      FOR i := 0 TO ScanlineByteCount-1 DO
      BEGIN
        RandomValue := Random(256);
        RowOut[i]   := RowIn[i] XOR RandomValue
      END
    END;

    ImageEncrypted.Picture.Graphic := BitmapEncrypted;

    DecryptImage;

    ButtonDecrypt.Enabled := TRUE;
    ButtonSave.Enabled := TRUE
  END {EncryptImage};


  PROCEDURE TFormCrypt.DecryptImage;
    VAR
      BitmapDecrypted  :  TBitmap;
      i                :  INTEGER;
      j                :  INTEGER;
      RandomValue      :  BYTE;
      rowIn            :  pByteArray;
      rowOut           :  pByteArray;
      ScanlineByteCount:  INTEGER;
  begin
    BitmapDecrypted             := TBitmap.Create;
    BitmapDecrypted.Width       := BitmapEncrypted.Width;
    BitmapDecrypted.Height      := BitmapEncrypted.Height;
    BitmapDecrypted.PixelFormat := BitmapEncrypted.PixelFormat;

    // Copy palette if palettized image
    IF   BitmapEncrypted.PixelFormat IN [pf1bit, pf4bit, pf8bit]
    THEN BitmapDecrypted.Palette := CopyPalette(BitmapEncrypted.Palette);

    // This finds the number of bytes per scanline regardless of PixelFormat
    ScanlineByteCount := ABS(Integer(BitmapEncrypted.Scanline[1]) -
                             Integer(BitmapEncrypted.Scanline[0]));

    TRY
      RandSeed := StrToInt(EditSeedDecrypt.Text)
    EXCEPT
      RandSeed := 79997  // use this prime number if entry is invalid
    END;

    FOR j := 0 TO BitmapEncrypted.Height-1 DO
    BEGIN
      RowIn  := BitmapEncrypted.Scanline[j];
      RowOut := BitmapDecrypted.Scanline[j];

      FOR i := 0 TO ScanlineByteCount-1 DO
      BEGIN
        RandomValue := Random(256);
        RowOut[i]  := RowIn[i]  XOR RandomValue
      END
    END;

    ImageDecrypted.Picture.Graphic := BitmapDecrypted;
    EditSeedDecrypt.Enabled := TRUE;
  END {DecryptImage};


procedure TFormCrypt.FormDestroy(Sender: TObject);
begin
  BitmapOriginal.Free;
  BitmapEncrypted.Free
end;


procedure TFormCrypt.ButtonLoadClick(Sender: TObject);
begin
  IF   OpenPictureDialog.Execute
  THEN BEGIN
    IF   Assigned(BitmapOriginal)
    THEN BitmapOriginal.Free;

    BitmapOriginal := TBitmap.Create;
    BitmapOriginal.LoadFromFile(OpenPictureDialog.Filename);
    ImageOriginal.Picture.Graphic := BitmapOriginal;

    ButtonEncrypt.Enabled := TRUE;
    EditSeedEncrypt.Enabled := TRUE;
  END
end;


procedure TFormCrypt.ButtonEncryptClick(Sender: TObject);
begin
  EncryptImage
end;


procedure TFormCrypt.ButtonDecryptClick(Sender: TObject);
begin
  DecryptImage
end;


procedure TFormCrypt.CheckBoxStretchClick(Sender: TObject);
begin
  ImageOriginal.Stretch  := CheckBoxStretch.Checked;
  ImageEncrypted.Stretch := CheckBoxStretch.Checked;
  ImageDecrypted.Stretch := CheckBoxStretch.Checked
end;


procedure TFormCrypt.EditSeedEncryptChange(Sender: TObject);
begin
  EncryptImage
end;


procedure TFormCrypt.EditSeedDecryptChange(Sender: TObject);
begin
  DecryptImage
end;


procedure TFormCrypt.LabelLab2Click(Sender: TObject);
begin
  ShellExecute(0, 'open', pchar('http://www.efg2.com/lab'),
               NIL, NIL, SW_NORMAL)
end;


// Make sure only valid numeric characters are present
procedure TFormCrypt.EditNumericKeyPress(Sender: TObject;
  var Key: Char);

  CONST
    Backspace  = #$08;
begin
  IF   NOT (Key IN [Backspace, '0'..'9'])
  THEN Key := #$00
end;


procedure TFormCrypt.ButtonSaveClick(Sender: TObject);
begin
  IF   SavePictureDialog.Execute
  THEN BitmapEncrypted.SaveToFile(SavePictureDialog.Filename)
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -