研究过图像的高手们,一定要伸出援助之手阿!(200分)

  • 主题发起人 主题发起人 labafa
  • 开始时间 开始时间
L

labafa

Unregistered / Unconfirmed
GUEST, unregistred user!
要用dialogic的传真卡发传真,而它只能发单色的pcx图像.
有如下几个问题:
1.如何获得报表或打印画布上需传真内容的祥素值?
2.如何将这些像素值保存成pcx图像(单色的,及每个象素值用1位表示)?
我知道这里delphi图像高手很多,请大家多多帮忙了!
 
请看如下代码
var
i,j,k, nRed, nGreen, nBlue: integer;
begin
i:=5, j:=5;
//读像素
nRed := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i,j]));
nGreen := GetGValue(ColorToRGB(Image1.Canvas.Pixels[i,j]));
nBlue := GetBValue(ColorToRGB(Image1.Canvas.Pixels[i,j]));

//写像素
Canvas.Pixels[i+320,j] := RGB(nRed ,nGreen,nBlue);
end;


如何保存为JPG格式
procedure TfrmColor.Button12Click(Sender: TObject);
var
jpg : TJpegImage;
begin
jpg := TJpegImage.Create;
jpg.Assign( image1.picture.bitmap );
// Here you can set the jpg object's properties as compression, size and more
jpg.SaveToFile ( './picture.jpg' );
Application.MessageBox('已经将图片以JPG格式存放在当前目录的picture.jpg文件中', '完成',MB_OK);
jpg.Free;
end;

 
找找看有没有第三方控件,将图形保存为PCX格式。
如果找不到,自己做也不难。弄清楚PCX的存储格式。
PCX采用行程压缩编码。
控制字的高两位为11,即11??????为控制字。
其第六位为后一字节重复个数。
如0xc6 0x31解码为0x31,0x31,0x31,0x31,0x31,0x31
我以前做过类似程序,不难,加油!
 
谢谢两位!
现在简单的图形,我可以生成了,但是稍复杂一点的图形会变形(偏移).
对原始数据按pcx编码的函数我是这样写的:
Source:由原始像素值按字节组成存放的数组;
Dest:编码后的字节数组
Count:原始数组长度
返回:编码后数组长度
function EncodeToPcx(const Source:array of byte; var Dest:array of byte; Count: Integer):integer;
type
Rec_PixInfo=record
iCount:integer;
vByte:byte;
end;
var
v_pixinfo:Rec_PixInfo;
i_s,i_d,i:integer;
div63:integer;
mod63:byte;
tmp:byte;
begin
i_d:=0;
i_s:=0;
while i_s<Count do
begin
v_pixinfo.vByte :=Source[i_s];
v_pixinfo.iCount :=1;
i_s:=i_s+1;
if i_s<Count then
begin
tmp:= Source[i_s];
while tmp=v_pixinfo.vByte do//re
begin
v_pixinfo.iCount :=v_pixinfo.iCount+1;
i_s:=i_s+1;
if i_s<Count then
tmp:=Source[i_s]
else
break;
end;
end;
if v_pixinfo.iCount >1 then
begin
div63:=v_pixinfo.iCount div 63;
mod63:=v_pixinfo.iCount mod 63;
for i:=1 to div63 do
begin
dest[i_d]:=$C0 or 63;
dest[i_d+1]:=v_pixinfo.vByte ;
i_d:=i_d+2;
end;
// i_d:=i_d+div63*2;
dest[i_d]:=$C0 or mod63;
dest[i_d+1]:=v_pixinfo.vByte ;
i_d:=i_d+2;
end
else//icount=1
begin
if v_pixinfo.vByte >$C0 then
begin
dest[i_d]:=$C0 or 1;
dest[i_d+1]:=v_pixinfo.vByte ;
i_d:=i_d+2;
end
else
begin
dest[i_d]:=v_pixinfo.vByte ;
i_d:=i_d+1;
end;
end;
end;
result:=i_d;
end;

在testimage中放入一bmp图片,想用如下代码把它这样存成pcx图片.
请高手帮忙看看有何不对的地方,导致稍复杂一点的图就变形了.
for i:=0 to (pcxheight-1) do //height
begin
for j:=0 to (pcxwidth-1) do //width
begin
colorvalue:=testimage.canvas.Pixels [j,i];
if colorvalue<>$FFFFFF then //not write
begin
binarystring:=binarystring+'0';//黑色
end
else
binarystring:=binarystring+'1';
if length(binarystring)=8 then//获得了8个像素值,组成一个字节
begin
//change to byte and full to pixbuf
tmpbyte:=changevalue(binarystring);
k:=j div 8;
pixbuf[k]:=tmpbyte;
binarystring:='';
end;
end;//end of for width 读完一行
....
ziplength:=EncodeToPcx(pixbuf,zipbuffer,pixbuflength);
...
end;

 
后来我发现,到了图片的边缘部分就不行了.
也就是说,如果在图片的中间部分画的很复杂也没问题,
但在边缘画一条直线也有问题(偏移).
不知是何缘故?
 
ok,问题解决,应是>=$C0
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部