SCANLINE怎么用?(50分)

真的很抱歉,太麻烦了(这不是分的问题),还得靠你自己呀,我只能帮一点点忙。
 
传的是8bit?
怎么没见你传颜色索引表呢? 8bit图像的颜色是由图像文件中256个整数的颜色索引表决定的。 你凭什么认为server图片用的颜色索引和你client机器上是一样的?
 
我CLIENT的IMAGE1和SERVER的IMAGE1是一样的(做测试用).
 
抱歉前面没看程序。
看了第一遍后, 觉得很奇怪, 奇怪你怎么能运行下去而没有崩溃。
又看了两遍之后, 还是不知道这段代码到底在干什么。

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var l1,l2,l3:pByteArray;
x,y,p:integer;
strsize:integer;
bmp1:Tbitmap;
begin
strsize:=socket.ReceiveLength ;
bmp1:=Tbitmap.Create ;
Bmp1.Assign(Image1.Picture.Bitmap);
bmp1.PixelFormat :=pf8bit;

socket.ReceiveBuf(l2,strsize); <----好恐怖的错误。
------ 1、l2未初始化, 记住: l2现在是nil,
------ 2、receivebuf的参数是var buf; 即一个无类型变参, 传入的是你给出变量的地址, 即这里将把l2这个变量所在的地址传入receivebuf中。
------ 从这个地址开始写入strsize个字节。 如果运行不报错的话, 此时l2, l3, x, y, p, 甚至strsize这几个变量都可能已经被改变了(视strsize内的值)。
------ 恐怖的是l2这个指针不知道指向哪里去了(也许指向机器BIOS的绝对地址了?)。

inc(p,strsize); <------- p未初始化, 因此p的值可能是3214276,

if p>=image1.Height then <------- 极大的可能性第一次进入clientread这个事件时p就已经>=image1.height了,哪怕读的只有1字节。
------ 这个判断语句很奇怪, 大概是写错了吧? if p>= image1.width还有点意义
------ 如果p正确初始化, 这段代码也很可疑。 除非socket一次收到超过一行的像素否则不可能进入这里。
begin
for y:=0 to image1.Height-1 do
begin
l1:=bmp1.ScanLine [y];
for x:=0 to image1.Width -1 do
if l1[x]<>l2[x] then
begin
l1[x]:=l2[x];
end;
end;

------ 上面一段循环很难理解它的含义。 能不能再解释一下? 为什么要将一张图片的每一行都和传进来的单独某一行数据进行比较? 然后将这张图片变成一张由各种颜色竖线组成的图片?

image1.Picture.Bitmap.Assign(bmp1);
bmp1.Free ;
end;
end;
 
呵呵,都是在VB里养成的坏习惯~~~~

因为我SERVER和CLIENT的图是一样的(SERVER有两张图,CLIENT有一张图且于SERVER的一张相同),我先将SERVER里的两图逐行比较,把不同的行发到CLIENT
再逐行检测CLIENT的图,这样就知道不同的是哪一行,在把这行写竟相应位置。
 
解释不对。 我问的是你为什么把client图片的每一行都写成谋一次server发过来的相同一行的数据(server发20行client的图片就写20遍, 而且最后client图片的每一行都变成最后发过来的那行)?
况且你接受程序绝对有问题, 能不能接受到server发过来的一行也成问题(很可能接受到的只有server发过来的半行, 这种情况下比较和复制根本不会执行而只是简单地抛弃server发来的数据。 或者接受到的是server发过来的第一行的后半段和第二行的前半段。 这种情况下怎么可能获得你期望的结果呢?)。
 
谢谢!那你觉得该怎么写呢?
 
我建议程序还是要重新写一遍吧. 我看到一个事件处理里面写这么多代码我就害怕.. :)

发送很简单..每次发送一行图象的缓冲.用个变量记录一下发送的行号..
接受嘛.先放到一个大一点的缓冲中.然后逐行截取放到bmp中..
 
要达到你的目的, 你server端必须发送行号(不然client怎么知道应当修改哪一行?)
server 端:
Image1.Picture.Bitmap.PixelFormat := pf8Bit;
Image2.Picture.Bitmap.PixelFormat := pf8Bit;
for i := 0 to Image1.Picture.Height-1 do
begin
l1 := Image1.Picture.Bitmap.ScanLine;
l2 := Image2.Picture.Bitmap.ScanLine;
if not comparemem(l1, l2, Image1.Width) then // 比较image1和image2每一行
begin
socket.SendBuf(i, Sizeof(Integer)); // 发送行号
socket.SendBuf(l2^,Image1.Width); // 发送Image2的整行数据
end;
end;


Client端:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var l1,l2:pByteArray;
n: Integer;
begin
Image1.Picture.Bitmap.PixelFormat := pf8Bit; // 建议把这行放到本过程外面去, 最好放在图片加载后调用一次
if Socket.ReceiveLength>=Image1.Width+SizeOf(Integer) then //接受到完整一行数据
begin
GetMem(l2, Image1.Width); // 分配接受缓冲区
Socket.ReceiveBuf(n, SizeOf(Integer)); // 接受行号
Socket.ReceiveBuf(l2^, Image1.Width); // 接受一行数据
l1 := Image1.picture.Bitmap.Scanline[n]; // 确定修改的是哪一行
move(l2^, l1^, Image1.Width); // 将整行数据替换成server端的数据
FreeMem(l2); // 释放缓冲区
end;
end;
 
这段代码你调试过了吗?
我这边的CLIENT的IMAGE1现在一点变化都没有呀
 
CLIENT好象没有执行 if Socket.ReceiveLength>=Image1.Width+SizeOf(Integer)以下的

是不是这句判断有误?
 
见意,先设计个专用的传送协议。
 
TO Another_eYes:
你的程序好象只能单独接受到行号,即每次RECIEVELENGTH都是4
SERVER的发送和CLIENT的接收不知该这么写?
 
因为TCP是一个流协议,并不一定你每Send一次就会发一个数据包,最好是定义一个简单的数据报结构。
当然,如果你每次发送的数据较少,应该没有太大问题。但两个Receive放在一起,似乎会有问题。

试试这样:
index: integer;
初试化时令
index:=1;

接收时:
if Socket.ReceiveLength > 0 then //接受到完整一行数据
begin
GetMem(l2, Image1.Width); // 分配接受缓冲区

if (index mod 2 <>0) then
Socket.ReceiveBuf(n, SizeOf(Integer)) // 接受行号
else
Socket.ReceiveBuf(l2^, Image1.Width); // 接受一行数据
inc(index);

l1 := Image1.picture.Bitmap.Scanline[n]; // 确定修改的是哪一行
move(l2^, l1^, Image1.Width); // 将整行数据替换成server端的数据
FreeMem(l2); // 释放缓冲区
end;
 
SCAN LINE OUT OF RANGE~~~

 
if Socket.ReceiveLength > 0 then //接受到完整一行数据
begin
GetMem(l2, Image1.Width); // 分配接受缓冲区

if (index mod 2 <>0) then
Socket.ReceiveBuf(n, SizeOf(Integer)) // 接受行号
else
begin
Socket.ReceiveBuf(l2^, Image1.Width); // 接受一行数据
l1 := Image1.picture.Bitmap.Scanline[n]; // 确定修改的是哪一行
move(l2^, l1^, Image1.Width); // 将整行数据替换成server端的数据
FreeMem(l2); // 释放缓冲区
end;

inc(index);
end;

这个问题,其实你自己应该能看出来。
 
MD,还是OUT OF RANGE
我N=0时,都越界?
 
你的图有多大?如果不大,真的不如传整幅图,这样简单。
 

Similar threads

回复
0
查看
578
不得闲
回复
0
查看
575
不得闲
回复
0
查看
665
不得闲
S
回复
0
查看
664
swish
S
顶部