|
1Qter豆
我的本意是用QT来显示tcp/ip中客户端接收过来的像素文件并且显示出来。图片的大小是128*496个字节,也就是128条线,每条线496个点,显示前每条线需要截去16个点,结果图像发生了错位。具体程序如下
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef unsigned int DWORD;
//const int dstSize = 128*2;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect_tcp();
QTimer *timer=new QTimer(this);
timer->setSingleShot(false);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);
}
Widget::~Widget()
{
close_tcp();
delete ui;
}
void Widget::connect_tcp()
{
struct sockaddr_in server;
struct sockaddr_in client;
int opt = 1;
socklen_t sin_len = sizeof(client);
// printf("aaa\n");
if( ( listensd = socket(AF_INET,SOCK_STREAM,0) ) == -1 )
{
perror("socket");
exit(1);
}
setsockopt(listensd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
// printf("bbb\n");
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(SER_PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(listensd,(struct sockaddr *)&server,sizeof(server)) < 0)
{
perror("Bind");
::close(listensd);
exit(1);
}
// printf("ccc \n");
if( listen(listensd,5) == -1 )
{
perror("listen");
::close(listensd);
exit(1);
}
while( (connectsd = accept(listensd,(struct sockaddr *)&client,&sin_len)) < 0 ) printf("ddd \n");;
// printf("connectsd=%d\n",connectsd);
}
void Widget::close_tcp()
{
::close(connectsd);
::close(listensd);
}
void Widget::paintEvent(QPaintEvent *e)
{
// t++;
// printf("%d",t);
// printf("ccc \n");
QPainter paint(this);
DWORD wsize = 128*480;
BYTE * psData1 = (BYTE*)malloc(wsize*2);
BYTE *psData = (BYTE*)malloc(wsize);
BYTE *p;
p = psData;
BYTE *p1;
p1 = psData1;
DWORD *pSrc = (DWORD*)malloc(wsize*sizeof(DWORD));
BYTE buff[128*16*2];
int rn=0,dn=0 ;
int i=1;
//读取128条线,截取他们的字头
for(i=1;i<=128;i++)
{
int sum=0;
dn = read(connectsd,buff,16*2);
printf("dn=%d",dn);
if(dn == 0)
{
printf("截错了\n");
break;
}
printf("截去第%d线字头",i);
while(1)
{
rn = read(connectsd,psData1+sum,MAX_LEN-sum);//MAX_LEN=480*2
if(rn==-1)
perror("read");
if(rn==0)
break;
sum += rn;
}
printf("sum=%d\n",sum);
psData1 += sum;
}
psData1 = p1;
//16位截取成8位
short mid[480*128];//16位一取,准备截位
char mid2[480*128];//装8位数据用的
char a[480*128*2];//把16位数据放到mid里
for(int i=0;i<480*128*2;i++)
{
a=*psData1;
psData1 +=1;
}
psData1 = p1;
int j=0;
for(int n=0;n<480*128;n++)
{
mid[n]=(short)a[j]+(((short)a[j+1])<<8);
j+=2;
}
for(int m=0;m<480*128;m++)
{
mid2[m] = (char)(mid[m]>>8);
*psData = mid2[m];
psData+=1;
}
psData = p;
//rgb色彩显示规则
for (unsigned int i = 0; i <wsize; ++i)
{
BYTE *pb=(BYTE *)(pSrc+i);
pSrc = 0;
pb[0] = psData;
pb[1] = psData;
pb[2] = psData;
}
free(psData1);
free(psData);
QByteArray imageByteArray = QByteArray( (const char*)pSrc, wsize*4 );
uchar* transData = (unsigned char*)imageByteArray.data();
QImage image = QImage(transData, 480, 128, QImage::Format_RGB32);
free(pSrc);
paint.drawImage(QPoint(100,200), image);
paint.end();
}
如果按打开文件的方式显示,正常结果应该是
但是我运行增加接收程序后它的结果是
显示的结果发生了错位,不知道什么原因,但是文件里的数据都是正确的啊。它运行的过程也是很诡异的,先显示了正常数据的前2/3,之后又显示了剩下的1/3,又刷新一遍将整个图片打乱,希望各位大神能给出宝贵的意见。小弟的邮箱是471719902@qq.com
|
|