二值化后字符如何显示为图像,急啊!

xmyyzhen 2008-05-07 08:02:55
数据库中存有图像二值化后的16进制字符串,如何还原显示为图像,请各位帮忙啊!!!
例一:
3070FF0780C1013CE01FEC3FF0033070FF0780C1013CE01FEC3FF00
308600E0F80E3001E70382C1FFC0F08610E1E00E3000770F03C001C
0E08610E1E00E3000770F03C001C0ED8630E1E007B000778E038001
C0CC8670C0F0076800158E038001C0CC8670C0F0076800158E03800
1C0C4969FC070034C00178E0B8031C0EC96F

例二:
0000f8ff017e0004e0ffff3f00000000f8ff017e0004e0ffff3f000
00102f87f00ff031ee0fffd1f80074140387c0087031e00f8780080
32500187c0081031e00383800e0012500187c0081031e00383800e0
010706183c8081071e0038380070000707381e8081071e001cf8017
0000746f80f00ff071c001cf81f7c000746
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
txyuan 2011-03-25
  • 打赏
  • 举报
回复
能把代码注说明就更好,方便我们菜鸟学习!!!!
xmyyzhen 2008-05-13
  • 打赏
  • 举报
回复
非常感谢各位的回复,经过多次咨询,数据未写入任何格式,只简单地存储了点的黑白信息,图像宽度112,解决如下
unit uFrmMain;

interface

uses
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.
gjcly 2008-05-08
  • 打赏
  • 举报
回复
0x6C74000072480000FFD8FFE000104A46494600010201012C012C0000
FFED0C7850686F746F73686F7020332E30003842494D03ED0000000000
10012C000000010002012C0000000100023842494D040D000000000004
000000783842494D03F300000000000800000000000000003842494D04
0A0000000000010000384249

这是一副JPG格式的肖像照片保存在SQL SERVER中的数据,应该与你的类似
gjcly 2008-05-08
  • 打赏
  • 举报
回复
ff07和F8FF表示什么类型不记得了,你可以在网上查一下。
gjcly 2008-05-08
  • 打赏
  • 举报
回复
不是编码压缩的,一般SQL SERVER保存图片会是这种格式,你自己在网上查询一下图片存储的格式,比如FFD8表示JPG图片,424D表示BMP图片,根据标记位先判断好图片类型后,取其后的代码就是图片的存储内容
给你一段参考代码(根据类型读入流后,写到一个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;
xmyyzhen 2008-05-07
  • 打赏
  • 举报
回复
尺寸应该是280×40
xmyyzhen 2008-05-07
  • 打赏
  • 举报
回复
我只对Delphi比较熟,各位专家多指点啊,delphi如何实现啊?
skylkj 2008-05-07
  • 打赏
  • 举报
回复
是现有格式的吗?

如果是280*40的话,楼主给的才256字节数据,肯定是编码压缩过的了
lizheng9564 2008-05-07
  • 打赏
  • 举报
回复
是你自己寫的軟件保存的,還是別人寫的呀。
如果數據有做壓宿處理的話,要找寫軟件的人。
xmyyzhen 2008-05-07
  • 打赏
  • 举报
回复
怎么没人回答啊?我自已顶

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧