图片和内存流的问题.困扰我好几天了,大家帮帮忙啊??

gou_xp 2007-04-14 02:53:39
有一字符串:str:='0x90CA6D1B6075AD0000000000CB4BA141145492819C4EDF7E004EE3968C3E0C3F874EBA68435F0B128E308543834F20611C579604033005428342894881511964865D110B935396608C33879E8F440E4B065391AD89618E0983558D5E873D07440A4D13520431079E8334023E865795AF01400A458230033C11330499105116'(255位).这是图片保存到数据库中的值.我现在想把这个值"直接"转换成图片,怎么办啊?
与此相关的我看了很多贴子了,都是关于图片和数据库之间的存取问题.我现在是想直接从某个地方读到此255位的值,然后我么写代码能在Image中显示啊?????????
...全文
299 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SonicX 2007-04-17
  • 打赏
  • 举报
回复
图片存在硬盘上是多大,返回的16进制就有多大
一般按照24bit位图文件来算,1个像素占3个字节,800*600的图片就是800*600*3再加文件头信息,你自己算算有多少
gou_xp 2007-04-17
  • 打赏
  • 举报
回复
我试了下,会报错误:Bitmap image is not valid.这是怎么回事啊?我的图片格式也是正确的了

还有,我把图片转换成十六进制后,返回的字符串有2000多位啊?太多了啊,是不是图片转换后都有这么多位的数据啊??
HsWong 2007-04-16
  • 打赏
  • 举报
回复
function Str2Hex(const data: array of byte; len: integer): string;
const
Hex: array[0..15] of char = '0123456789ABCDEF';
var
i: Integer;
begin
setlength(result, length(data) * 2);
for i := 0 to Len - 1 do
begin
result[i * 2 + 1] := Hex[data[i] shr 4];
result[i * 2 + 2] := Hex[data[i] and $F];
end;
end;

procedure Hex2Int(var Data: array of Byte; const Source: string);
var
i: Integer;
Size: Integer;
Hex2: string;
begin
Size := Length(Source);
i := 0;
while i < Size do
begin
Hex2 := '$' + Source[i + 1] + Source[i + 2];
Data[i div 2] := StrToInt(Hex2);
inc(i, 2);
end;
end;

function PicToHex(FileName:string):string; //图片转16进制字符串
var
f: file;
NumRead: integer;
Buffer: array[1..1024] of byte;
begin
AssignFile(f, FileName);
Reset(f, 1);
repeat
BlockRead(f, Buffer, BUF_SIZE, NumRead);
if NumRead = 0 then
break;
Result := Str2Hex(Buffer, NumRead); //将每个字节以16进制表示
until (NumRead = 0);
CloseFile(f);
end;

//这样应用

procedure TForm1.Button1Click(Sender: TObject);
var
PicHex: string;
buffer: array[1..1024] of Byte;
ms: TMemoryStream;
begin
PicHex:=PicToHex('C:\Up_Show.bmp');
ms := TMemoryStream.Create;
Hex2Int(buffer, PicHex);
ms.WriteBuffer(Buffer, Length(PicHex) div 2);
ms.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(ms);
ms.free;
end;
gou_xp 2007-04-16
  • 打赏
  • 举报
回复
pzl625() ( ) 信誉:100
把它化做内存流SaveToStream
LoadFromStream读出来就行了
那用管那么多的东西的啊

能不能给我一个具体一点的代码.把它化成内存流后,我想以十六进制的方式进行保存,以后再以这种方式找开图片,怎么弄啊??

谢谢了
仙侣步惊云 2007-04-16
  • 打赏
  • 举报
回复
你是以什么格式的流保存的,就以什么格式还原出来
pzl625 2007-04-16
  • 打赏
  • 举报
回复
把它化做内存流SaveToStream
LoadFromStream读出来就行了
那用管那么多的东西的啊
lwk_hlj 2007-04-16
  • 打赏
  • 举报
回复
你这个东西应该是一个十六进制的字符串,

只是保存数据信息了,

而文件头信息是没有的,另外,开始的0x是没有意义的东西,

Red_angelX 2007-04-16
  • 打赏
  • 举报
回复
str? 图片因该存成char[]
gou_xp 2007-04-16
  • 打赏
  • 举报
回复
哦,我也不是很清楚的.
我的图片就是指纹图片,应该没有多大的.

那我还想问一下,能不能把小图片转换成16进制的代码,然后又能把此代码转换成图片啊??????

前辈们,有点急,希望能快点给我回复哦?谢谢大家
SonicX 2007-04-14
  • 打赏
  • 举报
回复
你的图有多大?一张255个字节的位图才多大呀,这个值应该是数据库中的索引值指向图片在数据库具体的存放位置及大小吧

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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