function gethex(image:timage):pchar; var x,y :Integer; R, G, B :Integer; S :String; begin for y:= 0 to Image.Height-1 do for x := 0 to Image.Width-1 do begin R := GetRValue(Image.Canvas.Pixels[x][y]); G := GetGValue(Image.Canvas.Pixels[x][y]); B := GetBValue(Image.Canvas.Pixels[x][y]); S := S+ IntToHex(R,2) + ' '; S := S+ IntToHex(G,2) + ' '; S := S+ IntToHex(B,2) + ' '; end; Result := Pchar(S); end; 只是速度可能比较慢,如果要提高速度,就要用Canvas的sacnline,但就要判断图象的色彩深度,比较麻烦。
还有两个问题: 1、如何得到这个image总的字节数 2、如何得到这个image单行的字节数
你是说image原来的字节数,还是转换完的?
给出一个非常简单的 function GetHex(Image:TImage):PChar; var mBuffer: TmemoryStream; begin mBuffer:= TmemoryStream.Create; Image.Picture.Bitmap.SaveToStream(mBuffer); Result:=mBuffer.memory; end;
var
x,y :Integer;
R, G, B :Integer;
S :String;
begin
for y:= 0 to Image.Height-1 do
for x := 0 to Image.Width-1 do
begin
R := GetRValue(Image.Canvas.Pixels[x][y]);
G := GetGValue(Image.Canvas.Pixels[x][y]);
B := GetBValue(Image.Canvas.Pixels[x][y]);
S := S+ IntToHex(R,2) + ' ';
S := S+ IntToHex(G,2) + ' ';
S := S+ IntToHex(B,2) + ' ';
end;
Result := Pchar(S);
end;
只是速度可能比较慢,如果要提高速度,就要用Canvas的sacnline,但就要判断图象的色彩深度,比较麻烦。
1、如何得到这个image总的字节数
2、如何得到这个image单行的字节数
function GetHex(Image:TImage):PChar;
var
mBuffer: TmemoryStream;
begin
mBuffer:= TmemoryStream.Create;
Image.Picture.Bitmap.SaveToStream(mBuffer);
Result:=mBuffer.memory;
end;
这样不行吧,出来的是一堆乱码
应该是转换后的总字节数和单行的字节数
如果是黑白(单色的)每个像素1个位。
256色的每个像素8个位。
24位真彩的每个像素24个位。
换算关系不用说了吧。还有,色彩深度可以通过image.pixelformat确定,pf1bit pf8bit pf16bit……
简单
每个像素转换后位9字节(R、G、B三个分量,每个2字节,还有3个间隔的空格)。图象面积乘上9就是总的。每行像素个数乘9就是一行的字节数。
还有就是那个gethex函数运行太慢了些
我上边给出的代码是把每个像素点都算成RGB三个色彩分量,把这些分量转化为代表16进制的字符串。
我不知道你需要这些16进制数干什么?如果你为了还原成图象用,我可以给你写个相当快的。如果你需要这些数表示成RGB序列,做文字显示,就还要维持这种工作模式才行。希望你说明函数的具体用途,我再给你写个新的,快的。
我公司有一台斑马打印机,不支持中文,但现在又需要打印出中文,想来想去只能
通过打印图象来实现了,所以才有了这样一个问题,其实这个函数只需处理黑白图象就可以了。斑马打印机打印图象需要三个参数分别是图象的十六进制值、图象的总字节数和单行的字节数(都是处理后的)。
真正用的时候应该是输入一个字符串(str:pchar)然后把字符传转换图象(image),最后把image转换为十六进制,返回这个十六进制值。
但我只是知道这样一个思路,具体到如何把image转换为十六进制值却不知如何下手了,还有就是图象的总字节数和单行的字节数这两个值也是不知道该如何取得。