怎样将jpg图片存为2进制文件

解决方案 »

  1.   

    unit ScreenCryptJPEG;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, ExtDlgs, JPEG;type
      TFormCrypt = class(TForm)
        ButtonLoadJPG: TButton;
        ImageOriginal: TImage;
        ImageEncrypted: TImage;
        ImageDecrypted: TImage;
        ButtonEncrypt: TButton;
        ButtonDecrypt: TButton;
        ButtonSaveBIN: TButton;
        EditSeedEncrypt: TEdit;
        LabelSeedEncrypt: TLabel;
        CheckBoxStretch: TCheckBox;
        LabelSeedDecrypt: TLabel;
        EditSeedDecrypt: TEdit;
        OpenPictureDialog: TOpenPictureDialog;
        SaveDialog: TSaveDialog;
        ButtonLoadBIN: TButton;
        OpenDialog: TOpenDialog;
        procedure FormDestroy(Sender: TObject);
        procedure ButtonLoadJPGClick(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 ButtonSaveBINClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ButtonLoadBINClick(Sender: TObject);
      private    
        JPEGOriginalBinary :  TMemoryStream; // Cannot be directly displayed in TImage
        JPEGEncryptedBinary:  TMemoryStream; // Cannot be directly displayed in TImage    PROCEDURE DecryptImage;
        PROCEDURE EncryptImage;
      public
        { Public declarations }
      end;var
      FormCrypt: TFormCrypt;implementation
    {$R *.DFM}  USES
        ShellAPI;  // ShellExecute  // Create pf24bit "noise" image using random numbers
      FUNCTION CreateNoiseImage(CONST Width, Height:  INTEGER):  TBitmap;
        VAR
          i  :  INTEGER;
          j  :  INTEGER;
          row:  pByteArray;
      BEGIN
        RESULT             := TBitmap.Create;
        RESULT.Width       := Width;
        RESULT.Height      := Height;
        RESULT.PixelFormat := pf24bit;    FOR j := 0 TO Height-1 DO
        BEGIN
          row := RESULT.Scanline[j];
          FOR i := 0 TO 3*Width-1 DO   // 3 bytes per pixel
          BEGIN
            row[i] := Random(256)
          END
        END
      END {CreateNoiseImage};
      // Encrypt bytes in JPEGOriginalBinary TMemoryStream to give JPEGEncryptedBinary
      PROCEDURE TFormCrypt.EncryptImage;
        VAR
          BitmapDisplay:  TBitmap;
          i            :  INTEGER;
          pIn          :  pByte;
          pOut         :  pByte;
          RandomValue  :  BYTE;
      BEGIN
        TRY
          RandSeed := StrToInt(EditSeedEncrypt.Text)
        EXCEPT
          RandSeed := 67547  // use this prime number if entry is invalid
        END;    IF   Assigned(JPEGEncryptedBinary)
        THEN JPEGEncryptedBinary.Free;    JPEGEncryptedBinary := TMemoryStream.Create;    // Encrypted version same size as the original version
        JPEGEncryptedBinary.Size := JPEGOriginalBinary.Size;    pIn  := JPEGOriginalBinary.Memory;
        pOut := JPEGEncryptedBinary.Memory;
        FOR i := 1 TO JPEGOriginalBinary.Size DO
        BEGIN
          RandomValue := Random(256);       //  0..255
          pOut^ := pIn^ XOR RandomValue;
          INC(pIn);
          INC(pOut)
        END;    // JPEGEncryptedBinary cannot be displayed as an image.  So, let's just
        // create a "noise" bitmap to display instead.  The "seed" for this noise
        // image will be the RandSeed left over from the JPEG encryption, so the
        // same noise image will be created for a given JPEG.    BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width,
                                          ImageEncrypted.Height);
        TRY
          ImageEncrypted.Picture.Graphic := BitmapDisplay;
        FINALLY
          BitmapDisplay.Free
        END;    DecryptImage;    ButtonDecrypt.Enabled := TRUE;
        ButtonSaveBIN.Enabled := TRUE  END {EncryptImage};
      PROCEDURE TFormCrypt.DecryptImage;
        VAR
          BitmapDisplay      :  TBitmap;
          i                  :  INTEGER;
          JPEGDecrypted      :  TJPEGImage;
          JPEGDecryptedBinary:  TMemoryStream;
          pIn                :  pByte;
          pOut               :  pByte;
          RandomValue        :  BYTE;
      

  2.   

    BEGIN
        TRY
          RandSeed := StrToInt(EditSeedDecrypt.Text)
        EXCEPT
          RandSeed := 67547  // use this prime number if entry is invalid
        END;    JPEGDecryptedBinary := TMemoryStream.Create;
        TRY      // Decrypted version same size as the encrypted version
          JPEGDecryptedBinary.Size := JPEGEncryptedBinary.Size;      pIn  := JPEGEncryptedBinary.Memory;
          pOut := JPEGDecryptedBinary.Memory;
          FOR i := 1 TO JPEGEncryptedBinary.Size DO
          BEGIN
            RandomValue := Random(256);       //  0..255
            pOut^ := pIn^ XOR RandomValue;
            INC(pIn);
            INC(pOut)
          END;      // At this point the decrypted JPEG binary stream is in the
          // JPEGDecryptedBinary stream.  Load this memory stream into the
          // JPEGDecrypted TJPEGImage.
          JPEGDecrypted := TJPEGImage.Create;
          TRY
            TRY
              JPEGDecrypted.LoadFromStream(JPEGDecryptedBinary);
              ImageDecrypted.Picture.Graphic := JPEGDecrypted;
            EXCEPT
              // If any error occurs in the conversion, just show a noise image
              BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width, ImageEncrypted.Height);
              TRY
                ImageDecrypted.Picture.Graphic := BitmapDisplay;
              FINALLY
                BitmapDisplay.Free
              END;
            END
          FINALLY
            JPEGDecrypted.Free
          END
        FINALLY
          JPEGDecryptedBinary.Free
        END;    EditSeedDecrypt.Enabled := TRUE;
      END {DecryptImage};
    procedure TFormCrypt.FormDestroy(Sender: TObject);
    begin
      JPEGOriginalBinary.Free;
      JPEGEncryptedBinary.Free
    end;
    procedure TFormCrypt.ButtonLoadJPGClick(Sender: TObject);
      VAR
        JPEGOriginal:  TJPEGImage;
    begin
      IF   OpenPictureDialog.Execute
      THEN BEGIN    // Load JPEG Image for Display
        JPEGOriginal := TJPEGImage.Create;
        TRY
          JPEGOriginal.LoadFromFile(OpenPictureDialog.Filename);
          ImageOriginal.Picture.Graphic := JPEGOriginal
        FINALLY
          JPEGOriginal.Free
        END;    // Load JPEG Image as Binary Stream
        IF   Assigned(JPEGOriginalBinary)
        THEN JPEGOriginalBinary.Free;
        JPEGOriginalBinary := TMemoryStream.Create;
        JPEGOriginalBinary.LoadFromFile(OpenPictureDialog.Filename);    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.ButtonSaveBINClick(Sender: TObject);
    begin
      IF   SaveDialog.Execute
      THEN JPEGEncryptedBinary.SaveToFile(SaveDialog.Filename)
    end;procedure TFormCrypt.FormCreate(Sender: TObject);
    begin
      SaveDialog.InitialDir := ExtractFilePath( ParamStr(0) )
    end;
    procedure TFormCrypt.ButtonLoadBINClick(Sender: TObject);
      VAR
        BitmapDisplay:  TBitmap;
    begin
      IF   OpenDialog.Execute
      THEN BEGIN
        // Load JPEG Image as Binary Stream
        IF   Assigned(JPEGEncryptedBinary)
        THEN JPEGEncryptedBinary.Free;
        JPEGEncryptedBinary := TMemoryStream.Create;
        JPEGEncryptedBinary.LoadFromFile(OpenDialog.Filename);    // Create "noise" bitmap to display since encrypted file cannot be
        // directly displayed (actually we don't even know if it's a valid
        // JPEG yet).
        BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width, ImageEncrypted.Height);
        TRY
          ImageEncrypted.Picture.Graphic := BitmapDisplay;
        FINALLY
          BitmapDisplay.Free
        END;    DecryptImage
      END;
    end;end.