void PreTreat::on_OpenImageButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,tr("open image file"), "./", tr("Image files(*.jpg *.png);;All files (*.*)"));
//窗口文字 默认目录 筛选后缀
widid=this->winId();
widid2=widid;
ReadImage(&ho_Image, HTuple(fileName.toStdString().c_str()));
// OpenWindow(ui->graphicsView->x(),ui->graphicsView->y(),ui->graphicsView->width(),ui->graphicsView->height(),widid2,"","",&hv_WindowHandle);
OpenWindow(0,0,ui->graphicsView->width(),ui->graphicsView->height(),widid2,"","",&hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
if(HDevWindowStack::IsOpen())
{
DispObj(ho_Image,HDevWindowStack::GetActive());
globalMark=1;
}
}
这段函数是对“打开图片”这个按钮的响应,效果就是出现一个窗口可以选择图片文件然后显示在这个窗口上。
widid2是获取了当前窗口的id并在openwindow这个函数里作为第五个参数,效果是可以使图片显示在当前窗口中,而不是打开一个新的窗口来显示。
在这个窗口的中有个qtui里面的部件graphicsView是一个用来显示图像的图像框部件,在openwindow函数中使用了从这个部件获取的参数ui->graphicsView->x(),ui->graphicsView->y(),ui->graphicsView->width(),ui->graphicsView->height()分别是图像框的位置和尺寸,本来目的是为了让图像显示在图像框中,但是效果却如上图所示,图片为了变成图像框的大小而被压缩变形,而且图片也没有如预期那样嵌入在框中,看着十分难受。最重要的是,这样也失去了使用graphicsView的意义,最理想的方式是能让graphicsView适应图片大小,在窗口中合理的显示出来,而不是图片去适应框的大小,因为图片有各种尺寸,而框的大小却是定好了的。
然后是想着从graphicsView来解决问题,上网搜索graphicsView的用法。。。找到这篇文章
Qt 在GraphicsView中 打开一幅图片
套用了这段代码:
this->image = new QImage();
if(image->load(fileName))
{
QGraphicsScene *scene = new QGraphicsScene;
scene->addPixmap(QPixmap::fromImage(*image));
ui->graphicsView->setScene(scene);
ui->graphicsView->resize(image->width() + 10, image->height() + 10);
ui->graphicsView->show();
}
头文件里还有个定义
private:
Ui::MainWindow *ui;
QImage *image;
完了效果如图:
可以看到显示了两张图片,小图是原来的方式显示 的,而大图是用上面这段代码显示的,放在一起正好可以看看差别。可以看到大图的图像框是随着图片伸展的,而且放在了框内,和按钮混在一起是因为还没在ui中做好布局,不过问题不大。
原来用halcon直接导出的代码中,关于图像的处理,无论是图片、图片尺寸、显示图片、对图片进行处理都是对
ho_Image进行处理,其类型是这样:
HObject ho_Image;
而用graphicsView显示图片,图片参数是这样:
QImage *image;
所以怎么实现将这两种类型互相转换呢?
下面是对C++转halcon格式的尝试(失败于没能高清halcon图像存储方式):
HObject Image;
int bpl=image->bytesPerLine();
int bc=image->byteCount();
int id=image->depth();
char ft=image->format();
//c++转halcon,有格式问题
unsigned char *data=image->bits();//获取图像像素字节数据的首地址
unsigned char*graydata;//灰度图向内存指针
graydata=new unsigned char[bpl*height];//存储处理后的数据
unsigned char r,g,b;
for (int i=0;i
通过一系列研究,了解了图像的存储方式,并知道了图像转换的过程:
首先获取图像长宽,计算图像的字节大小并初始化目标图像内存空间,然后通过循环每个像素将原图像数据内容复制进目标图像内存空间,最后通过调用halcon中的图像生成函数,将目标图像指针对应的图像生成halcon中的类型的图像。
最后失败图像:
最后的解决方法:放弃c++和halcon间的类型转换,halcol里的类型用于图像处理,而图像在界面上的显示就用qt的方法。