怎样将jpg图片存为2进制文件
解决方案 »
- Teechart 8 在三维模式中,如和给Depth轴增加箭头
- 还是关于UAC问题
- delphi indy idhttp用Get方式下载数据,怎么控制下载速度。必须在客户端限制!
- 取TreeView当前节点的节点序号??怎么取?!
- 有什么控件能显示波形?
- 这个该怎么做?
- Reopen.Items.Count 为什么报错?up有分!
- 我需要一个dbgrid类控件可以有多行表头,有什么好建议吗?(不要dbgrideh)
- 帮帮忙EClassNotFound问题
- 这个主函数怎样去写?
- 如何捕捉DOS命令窗是否关闭?请各位大侠请点,在线等待!!!
- 大家好,能不能帮我看看:客户端怎么连不上服务器数据库(我们的网是通的)?先给100分,不够了再加!
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;
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.