关于48位tiff图像的读取操作保存

woshimo 2013-08-10 10:46:28
各位好,我有一个问题向大家请教,有48位的tiff图像,我用GDI+把它读进去,能正确显示
我用bitmapdata获取图像信息,可以看到每行的字节数是图像宽度的6倍,即每个像素有6个字节,
于是我用一个WORD指针指向数据首地址,依次读取数据的时候,却发现读取的数值有问题,按道理说
RGB每个通道是16bit,数值的范围应该是0-65535,我用WORD指针去读时发现数值为十几,而将图像
用matlab打开,发现数值是六千多,这个是合理的。我现在不明白我是哪里有问题……请各位赐教
...全文
348 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshimo 2013-08-10
  • 打赏
  • 举报
回复
不过还是很奇怪,读到的数值跟matlab对应不上。。
woshimo 2013-08-10
  • 打赏
  • 举报
回复
很奇怪,在opencv里换一种方式,调用cvloadimage就没有问题了,我在想是不是有可能是图像数据载时就被改变了。请问各位有谁知道这样的么?
woshimo 2013-08-10
  • 打赏
  • 举报
回复
读取的值都有问题,数值很小,于是我试用opencv去读取同一幅图像,读取得到的数值也是同样很小,真是不明白问题在哪里,以下一小段opencv的代码
int _tmain(int argc, _TCHAR* argv[])
{
	const char* imagename = "001呼吸道发光检测.tif";

	//从文件中读入图像
	Mat img = cv::imread(imagename);
	
	//如果读入图像失败
	if(img.empty())
	{
		fprintf(stderr, "Can not load image %s\n", imagename);
		return -1;
	}

	int channels = img.channels();
	int nRows = img.rows;
	int nCols = img.cols;

	Mat_<Vec3b> Img = img;


	int i,j;
	ushort* p; 
	int value1,value2,value3;
	for( i = 0; i < nRows; ++i)
	{
		p = img.ptr<ushort>(i);
		for ( j = 0; j < nCols; ++j)
		{
			value1 = Img(i,j)[0];
			value2 = Img(i,j)[1];
			value3 = Img(i,j)[2];
			
		}
	}


	//显示图像
	imshow("image", img);

	//此函数等待按键,按键盘任意键就返回
	waitKey();

	
	return 0;
}
szyyjzy 2013-08-10
  • 打赏
  • 举报
回复
应该不是每个字节都异常吧,我记得图像识别中每行数据组织有补齐数据,也就是不足一定长度会在每行结尾补齐,很久没有做这方面的开发,只是模模糊糊有这么点印象,刚刚我看MSDN上的示例,我觉得这样操作绝大多数情况下没有问题,但是在一些特定宽度的图像,读取后会错位异常,希望能给你点思路。 下面是MSDN上的示例代码:
VOID Example_LockBits3(HDC hdc)
{
   Graphics graphics(hdc);
   INT row, col;

   // Create and fill a pixel data buffer.
   UINT pixels[30][50];
   for(row = 0; row > 30; ++row)
      for(col = 0; col > 50; ++col)
         pixels[row][col] = 0xff00ffff;  // aqua

   BitmapData bitmapData;
   bitmapData.Width = 50,
   bitmapData.Height = 30,
   bitmapData.Stride = 4*bitmapData.Width;
   bitmapData.PixelFormat = PixelFormat32bppARGB; 
   bitmapData.Scan0 = (VOID*)pixels;
   bitmapData.Reserved = NULL;

   // Create a Bitmap object from a BMP file.
   Bitmap bitmap(L"LockBitsTest2.bmp");

   // Display the bitmap before locking and altering it.
   graphics.DrawImage(&bitmap, 10, 10);

   // Lock a 50x30 rectangular portion of the bitmap for writing.
   Rect rect(20, 10, 50, 30);

   bitmap.LockBits(
      &rect,
      ImageLockModeWrite|ImageLockModeUserInputBuf,
      PixelFormat32bppARGB,
      &bitmapData);
 
   // Commit the changes and unlock the 50x30 portion of the bitmap.  
   bitmap.UnlockBits(&bitmapData);

   // Display the altered bitmap.
   graphics.DrawImage(&bitmap, 150, 10);
}
1.该程序用QT开发,实现图片导入、显示、缩放、拖动及处理(冷暖色、灰度、亮度、饱和、模糊、锐化)。 经实测,我写的这个软件在导入10000*7096像素的超大图片的时候,缩放的速度比2345看图软件还快,2345缩放超大图会卡顿,但本软件不会^_^ 关于程序中缩放拖动部分的说面参见我的博客https://blog.csdn.net/weixin_43935474/article/details/89327314; 2.载入图片后,鼠标移动的时候可以显示鼠所在点的图像的坐标以及灰度; 3.缩放的时候,图片右上角可以显示当前图片的缩放比例; 4.用户可导入16位深的tiff灰度图文件(一般来说是由相机拍摄的灰度图数据),导入16位深的tiff的时候,用户需要先点击界面左上角的checkbox,然后再导入tiff图片,否则图片解析不出来。 注:Qt自带的QImage只能导入8位深的tiff灰度图,如果用qt的QImage导入16位深的灰度图,图像数据会被强制转换成argb格式的图像,数据就被更改了,所以我自己编写一个解析tiff文件的功能,我翻阅了很多博客,其中如下链接给我的帮助最大: https://blog.csdn.net/chenlu5201314/article/details/56276903 上述博客作为详细解析tiff文件结构的说明文档,写的非常详细,我也是根据上面的内容,自己编写了一个解析tiff文件的类(当然功能很少,只能解析符合特定条件的tiff文件) //************************************************************ //by Bruce Xu //注:解析tiff的类只解析特定的tiff文件! //1.解析的tiff文件中只存在一幅图,如果文件中存在多幅图,本类不支持解析! //2.图像数据为8位或16位深度的灰度图,如果是其他类型的图片,本类不支持解析! //3.图片没有被压缩过! //************************************************************

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧