普通图像数据转换为halcon能操作的图像数据的办法

By admin at 2019-05-11 • 1人收藏 • 2358人看过

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=1171;bottom=767)
winform.add(
picturebox={cls="picturebox";left=400;top=0;right=1172;bottom=768;z=1};
picturebox2={cls="picturebox";left=0;top=0;right=317;bottom=267;z=2}
)
/*}}*/

import soImage;

HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}")

/*
Image = HOperatorSetX.ReadImage( 'C:/Users/popdes/Desktop/f083.png' );
var GrayImage = HOperatorSetX.Rgb1ToGray( Image );
var Width , Height = HOperatorSetX.GetImageSize( GrayImage );

*/

var simg = soImage();
simg.load("C:\Users\popdes\Desktop\f083.png")
simg.grayScale();

winform.picturebox2.image = simg.getBytes("*.bmp")
//垂直翻转, 不执行这个会导致图像上下反的
simg.flip()
var addr = tonumber(raw.toPointer(simg.getBytes("*.bmp")));
var Image = HOperatorSetX.GenImage1( "byte" , simg.getWidth() , simg.getHeight() , addr );

var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , winform.picturebox.width , winform.picturebox.height , winform.picturebox.hwnd , "visible", "" );

HOperatorSetX.DispObj( Image , WindowHandle );

winform.show();
win.loopMessage();
return winform;

先记录到这里, 明显是有问题的, 正常情况下, 窗口应该两个图像显示的一致, 但是这个显示明显左右分离了

2 个回复 | 最后更新于 2019-05-12
2019-05-11   #1

上面实现的方式有点问题, 去网上搜了下

参考网址里面的写法https://blog.csdn.net/bingbingxie1/article/details/83344704

实现了 bitmap变量转为 halcon变量

//bitmap变量转为 halcon变量
var bmp2halconPtr = function(bmpPath){
    //从文件创建位图
	var bmp = gdip.bitmap(bmpPath);
	//获取位图数据
	var bmpdata = bmp.lockData32(,0x30803/*_PixelFormat8bppIndexed*/);
	var dataBlue = raw.buffer(bmp.width*bmp.height)
	var ptrdata = tonumber(raw.toPointer(dataBlue));
	for(i=0;bmp.height-1;1){
		::CopyMemory(topointer((ptrdata+bmp.width*i)),topointer(tonumber(raw.toPointer(bmpdata.Scan0))+bmpdata.Stride*i),bmp.width);
	}
	bmp.unlockData(bmpdata);
	return ptrdata,bmp.width,bmp.height;
}



var ptrdata,宽,高 = bmp2halconPtr("C:\Users\popdes\Desktop\f083.png")

var Image2 = HOperatorSetX.GenImage1( "byte" , 宽 , 高 , ptrdata );

var WindowHandle2 = HOperatorSetX.OpenWindow( 0 , 0 , winform.picturebox3.width , winform.picturebox3.height , winform.picturebox3.hwnd , "visible", "" );

HOperatorSetX.SetPart( WindowHandle2 , 0 , 0 , 高-1 , 宽-1 );

HOperatorSetX.DispObj( Image2 , WindowHandle2 );

image.png

2019-05-12   #2

halcon图像变量转普通bitmap图像

代码如下,目前还有问题, 没实现成功, 以后有时间继续研究, 先放一边

	var PointerRed , PointerGreen , PointerBlue , Type , Width , Height = HOperatorSetX.GetImagePointer3( Image );
	console.varDump(PointerRed)

	var PRed = raw.buffer(raw.tostring(topointer(PointerRed)))
	var PGreen = raw.buffer(raw.tostring(topointer(PointerGreen)))
	var PBlue= raw.buffer(raw.tostring(topointer(PointerBlue)))

	console.log(Type , Width , Height)

	var bmp5 = gdip.bitmap(Height , Width);
	//获取位图数据
	var bmpdata = bmp5.lockData32(,0x22009/*_PixelFormat32bppRGB*/);

	var bptr = bmpdata.Scan0;

	for(i=1;Width*Height;1){
		bptr[(i-1)*4+1]=PBlue[i];
		bptr[(i-1)*4+2]=PGreen[i];
		bptr[(i-1)*4+3]=PRed[i];
		bptr[(i-1)*4+4]=255;
	}
	bmp5.unlockData(bmpdata);

winform.plus.background = bmp5;

目前还只是黑色一片.......

image.png

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...