数据库中存有图像二值化后的16进制字符串,如何还原显示为图像,请各位帮忙啊!!!
例一:
3070FF0780C1013CE01FEC3FF0033070FF0780C1013CE01FEC3FF00
308600E0F80E3001E70382C1FFC0F08610E1E00E3000770F03C001C
0E08610E1E00E3000770F03C001C0ED8630E1E007B000778E038001
C0CC8670C0F0076800158E038001C0CC8670C0F0076800158E03800
1C0C4969FC070034C00178E0B8031C0EC96F例二:
0000f8ff017e0004e0ffff3f00000000f8ff017e0004e0ffff3f000
00102f87f00ff031ee0fffd1f80074140387c0087031e00f8780080
32500187c0081031e00383800e0012500187c0081031e00383800e0
010706183c8081071e0038380070000707381e8081071e001cf8017
0000746f80f00ff071c001cf81f7c000746
例一:
3070FF0780C1013CE01FEC3FF0033070FF0780C1013CE01FEC3FF00
308600E0F80E3001E70382C1FFC0F08610E1E00E3000770F03C001C
0E08610E1E00E3000770F03C001C0ED8630E1E007B000778E038001
C0CC8670C0F0076800158E038001C0CC8670C0F0076800158E03800
1C0C4969FC070034C00178E0B8031C0EC96F例二:
0000f8ff017e0004e0ffff3f00000000f8ff017e0004e0ffff3f000
00102f87f00ff031ee0fffd1f80074140387c0087031e00f8780080
32500187c0081031e00383800e0012500187c0081031e00383800e0
010706183c8081071e0038380070000707381e8081071e001cf8017
0000746f80f00ff071c001cf81f7c000746
给你一段参考代码(根据类型读入流后,写到一个IMAGE里面):
function TDM.JpegStartsInBlob(PicField:TBlobField):integer;
var
bs:TADOBlobStream;
buffer:Word;
hx:string;
begin
Result:=-1;
bs:=TADOBlobStream.Create(PicField,bmRead);
try
while (Result=-1)and(bS.Position+1<bS.Size) do
begin
bS.ReadBuffer(buffer,1);
hx:=IntToHex(buffer,2);
if hx='FF'then
begin
bS.ReadBuffer(buffer,1);
hx:=IntToHex(buffer,2);
if hx='D8'then Result:=bS.Position-2
else if hx='FF' then bS.Position:=bS.Position-1;
end;
end;
finally
bS.Free;
end;
end;function TDM.BMPStartsInBlob(PicField:TBlobField):integer;
var
bs:TADOBlobStream;
buffer:Word;
hx:string;
begin
Result:=-1;
bs:=TADOBlobStream.Create(PicField,bmRead);
try
while (Result=-1)and(bS.Position+1<bS.Size) do
begin
bS.ReadBuffer(buffer,1);
hx:=IntToHex(buffer,2);
if hx='42'then
begin
bS.ReadBuffer(buffer,1);
hx:=IntToHex(buffer,2);
if hx='4D'then Result:=bS.Position-2
else if hx='FF' then bS.Position:=bS.Position-1;
end;
end;
finally
bS.Free;
end;
end;procedure TDM.ShowImage(PicField:TBlobField;SImage:TImage);
var
bS:TADOBlobStream;
Pic:TJpegImage;
BImage:TBitMap;
begin
bS:=TADOBlobStream.Create(PicField,bmRead);
try
if JpegStartsInBlob(PicField)<>-1 then
begin
bS.Seek(JpegStartsInBlob(PicField),soFromBeginning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
SImage.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
end
else if BMPStartsInBlob(PicField)<>-1 then
begin
bS.Seek(BMPStartsInBlob(PicField),soFromBeginning);
BImage:=TBitMap.Create;
try
BImage.LoadFromStream(bS);
SImage.Picture.Bitmap:=BImage;
finally
BImage.Free;
end;
end
else
begin
SImage.Picture:=Nil;
end;
finally
bS.Free;
end;
end;
FFED0C7850686F746F73686F7020332E30003842494D03ED0000000000
10012C000000010002012C0000000100023842494D040D000000000004
000000783842494D03F300000000000800000000000000003842494D04
0A0000000000010000384249这是一副JPG格式的肖像照片保存在SQL SERVER中的数据,应该与你的类似
unit uFrmMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TFrmMain = class(TForm)
mmoHex: TMemo;
pbPlate: TPaintBox;
btn1: TButton;
btnExit: TButton;
lbl1: TLabel;
mmoNext: TMemo;
procedure pbPlatePaint(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FValidBuffer: Boolean;
FBuff: array[0..2239] of Byte; procedure prShowPlate;
function fnTruncate(AValue: string): string;
function fnHexToByte(AData: Char): Byte;
public
{ Public declarations }
end;var
FrmMain: TFrmMain;implementation{$R *.dfm}procedure TFrmMain.pbPlatePaint(Sender: TObject);
begin
with pbPlate.Canvas do
begin
Brush.Color := clBlack;
FillRect(ClientRect); if FValidBuffer then
prShowPlate;
end;
end;procedure TFrmMain.btn1Click(Sender: TObject);
var
I: Integer;
J: Integer;
FLoValue: Byte;
FHiValue: Byte;
FText: string;
FLen: Integer;
begin
FillChar(FBuff, SizeOf(FBuff), 0); FText := fnTruncate(UpperCase(mmoHex.Text));
FLen := Length(FText) div 2;
J := 0;
for I := 0 to FLen - 1 do
begin
FHiValue := fnHexToByte(FText[I * 2 + 1]);
FLoValue := fnHexToByte(FText[I * 2 + 2]);
FBuff[J] := FLoValue and 1;
FBuff[J + 1] := (FLoValue shr 1) and 1;
FBuff[J + 2] := (FLoValue shr 2) and 1;
FBuff[J + 3] := (FLoValue shr 3) and 1;
FBuff[J + 4] := FHiValue and 1;
FBuff[J + 5] := (FHiValue shr 1) and 1;
FBuff[J + 6] := (FHiValue shr 2) and 1;
FBuff[J + 7] := (FHiValue shr 3) and 1; Inc(J, 8);
end; FValidBuffer := True;
pbPlate.Invalidate;
end;procedure TFrmMain.btnExitClick(Sender: TObject);
begin
Close;
end;function TFrmMain.fnHexToByte(AData: Char): Byte;
begin
case AData of
'1'..'9': Result := Ord(AData) - Ord('0');
'A'..'F': Result := Ord(AData) - Ord('A') + 10;
else
Result := 0;
end;
end;function TFrmMain.fnTruncate(AValue: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(AValue) do
begin
if AValue[I] In [#10, #13] then Continue; Result := Result + AValue[I];
end;
end;procedure TFrmMain.FormCreate(Sender: TObject);
begin
mmoHex.Text := UpperCase(mmoHex.Text);
FValidBuffer := False;
end;procedure TFrmMain.prShowPlate;
var
I: Integer;
FRow: Integer;
FCol: Integer;
begin
with pbPlate.Canvas do
begin
for I := 0 to 2239 do
begin
FRow := I mod 112;
FCol := I div 112; if FBuff[I] = 1 then
Pixels[FRow, FCol] := clWhite
else
Pixels[FRow, FCol] := clBlack;
end;
end;
end;end.