TIFFReadRGBAImage栅格小于图像时抛异常的解决方法
问题根因
触发访问冲突的核心是你只修改了raster的内存分配大小,没有同步修改传入TIFFReadRGBAImageOriented的宽高参数:
- 该函数会严格按照入参传入的
width、height计算写入内存的总长度,按width * height的像素量向raster指向的地址写入数据 - 你仅把分配的内存缩小到
(width-100)*(height-100),但传入函数的宽高还是原图尺寸,函数写入的数据量超出已分配的内存边界,必然触发访问越界。
你对接口说明的理解存在偏差:接口提到的「raster尺寸小于图像时自动按边界裁剪」,要求传入函数的width/height参数必须和raster分配内存对应的宽高完全匹配,而非仅修改内存大小、保留原宽高参数。
正确实现(裁剪右侧、下侧各100像素)
直接将裁剪后的目标宽高同步传入内存分配逻辑和读取接口即可,参考代码如下:
// 修正原代码笔误:原代码多写了一个右尖括号 std::vector<uint32> image; uint32 orig_width; uint32 orig_height; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &orig_width); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &orig_height); // 定义裁剪后的目标尺寸:裁掉右侧100像素、下侧100像素 uint32 target_width = orig_width - 100; uint32 target_height = orig_height - 100; uint32 npixels = target_width * target_height; uint32* raster = (uint32*)_TIFFmalloc(npixels * sizeof(uint32)); // 注意此处必须传入裁剪后的目标宽高,不能传原图原始宽高 if (TIFFReadRGBAImageOriented(tif, target_width, target_height, raster, ORIENTATION_TOPLEFT, 0) == 1) { // 修正原代码笔误:原代码std:endl少写了一个冒号 std::cout << "success" << std::endl; } // 业务逻辑处理完成后,记得调用_TIFFfree(raster)释放内存,避免泄漏
注意事项
- 上述方法仅支持从图像左上角开始裁剪,即保留左上区域、丢弃右侧和下侧内容,完全匹配你的裁剪需求
- 如果需要裁剪非左上角的任意区域(比如提取图像中间子图、裁掉四周边框),该接口无法直接实现,需要先读取完整图像到raster,再手动拷贝目标区域的像素数据
- 传入接口的
target_width不能超过原图原始宽度,否则会出现读取异常
内容的提问来源于stack exchange,提问作者DGIS
相关产品推荐
相关产品推荐

