获取文件夹下所有tif图片,并将16位图转为8位图
主函数
#include "image.h"
#include <string>
#include<cmath>
#include<math.h>int main(int argc, char *argv[])
{Image *Im = new Image();//定义的一个读写图片的类,用的tif库std::string outputpath;std::string inputpath;std::cout << "input image data input path:";std::cin >> inputpath;std::cout << "input image data outnput path:";std::cin >> outputpath;QString name_a = ".tif";QDir dir(QString::fromStdString(inputpath));if (!dir.exists()){qWarning("cannot open dir");}QStringList filter;QString fit("*");fit.append(name_a);filter << fit;dir.setNameFilters(filter);QStringList abclist = dir.entryList();QString str_temp;QString str_temp1;QStringList file_input_list;QStringList file_output_list;// std::cout << abclist.size();int thenumber = abclist.size();for (int kk = 0; kk < abclist.size(); kk++){str_temp = QString::fromStdString(inputpath);str_temp.append("/");str_temp.append(abclist.at(kk));file_input_list.append(str_temp);str_temp.clear();str_temp1 = QString::fromStdString(outputpath);str_temp1.append("/");str_temp1.append(abclist.at(kk));file_output_list.append(str_temp1);str_temp1.clear();}int numProcs = omp_get_num_procs();int size = file_input_list.length();int width = Im->get_Image_width(file_input_list[0].toStdString().c_str());//获取图片的宽int height = Im->get_Image_height(file_input_list[0].toStdString().c_str());//获取图片的高
#pragma omp parallel for num_threads(numProcs)for (int num = 0; num < size; num++){uint16 *nImage = new uint16[width*height];memset(nImage, 0, sizeof(uint16)*width*height);Im->Read16BitImage(file_input_list[num].toStdString().c_str(), nImage, width, height);unsigned char * nImage8 = new unsigned char[width*height];memset(nImage8, 0, sizeof(unsigned char)*width*height);Im->transform16_8bit(nImage, nImage8,width, height);/*Im->connect_filter(nImage, width, height, depth);*//*Im->Median_filter(nImage, width, height, depth);*/std::cout << num << std::endl;Im->Write8BitImage(file_output_list[num].toStdString().c_str(), nImage8, width, height);delete[]nImage;nImage = NULL;delete[]nImage8;nImage8 = NULL;}return 1;
主函数用到的函数
int Image::get_Image_width(const char path[])
{TIFFSetWarningHandler(0);TIFF *tif = TIFFOpen(path, "r");if (tif == 0) {printf(" open TIFF file %s failed\n", path);return false;}int width = 0;uint16 comperID;uint32 perrow;TIFFGetField(tif, TIFFTAG_COMPRESSION, &comperID);TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &perrow);TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);TIFFClose(tif);std::cout << "TIFFTAG_COMPRESSION is " << comperID << std::endl;std::cout << "TIFFTAG_ROWSPERSTRIP is " << perrow << std::endl;return width;
}int Image::get_Image_height(const char path[])
{TIFFSetWarningHandler(0);TIFF *tif = TIFFOpen(path, "r");if (tif == 0) {printf(" open TIFF file %s failed\n", path);return false;}int height = 0;TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);TIFFClose(tif);return height;}bool Image::Read16BitImage(const char path[], uint16* &Image, int &width, int &height)
{TIFFSetWarningHandler(0);TIFF *tif = TIFFOpen(path, "r");if (tif == 0) {printf(" open TIFF file %s failed\n", path);return false;}TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);//Image = new uint16[width*height];TIFFSetWarningHandler(0);/*TIFF *tif = TIFFOpen(path, "r");*/if (tif == 0) {printf(" open TIFF file %s failed\n", path);}else{uint32 row;for (row = 0; row <(uint32)height; row++){//需要注意,这里内存偏移必须写为(row-ys)*widthTIFFReadScanline(tif, (Image + row*width), row);}TIFFClose(tif);}return true;
}void Image::transform16_8bit(uint16 *image, unsigned char* data, int width, int height)
{int maxdata = 0;int mindata = 65535;for (int i = 0; i < height; i++)for (int j = 0; j < width; j++){if (image[j + i*width]>maxdata)maxdata = image[j + i*width];if (image[j + i*width] < mindata&&image[j + i*width] != 0)mindata = image[j + i*width];}//unsigned char* data = new unsigned char[width*height];//memset(data, 0, sizeof(unsigned char)*width*height);for (int i = 0; i < height; i++)for (int j = 0; j < width; j++){if (image[j + i*width] != 0){data[j + i*width] = 254.0 / (double)(maxdata - mindata)*(image[j + i*width] - mindata) + 1;}}
}bool Image::Write8BitImage(const char path[], uint8* Image, int width, int height)
{TIFF *tif = TIFFOpen(path, "w");TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); //每个像素点应有几个通道TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); //每个通道的位宽,这里为8位图片TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_LEFTTOP);TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); //设定图片显示时,灰度值越小的像素越接近黑色// TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, width));TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);uint8 * curRow = new uint8[width];for (uint32 row = 0; row < height; row++){//memcpy(curRow, (buffer+row*width), width); // check the index here, and figure out why not using h*linebytesif (TIFFWriteScanline(tif, Image + row*width, row, 0) < 0)break;}delete[]curRow;TIFFClose(tif);return true;
}
获取文件夹下所有tif图片,并将16位图转为8位图相关推荐
- 获取文件夹下的文件名并存入txt中
import os path_imgs='C:/Users/13451/Desktop/pic' #图片存放的地址 for files in os.listdir(path_imgs): #listd ...
- Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)
Windows批处理命令快速获取文件夹下特定类型的文件名 (2022.5.15) 1.需求分析 2.batch简介 3.代码实现 3.1 八种编程语言分别实现 3.1.1 C# 实现 3.1.2 C+ ...
- Qt 获取文件夹下所有文件
Qt 获取文件夹下所有文件代码如下: QStringList getFileNames(const QString &path) {QDir dir(path);QStringList nam ...
- C#获取文件夹下指定格式的所有文件
C#获取文件夹下指定格式的所有文件的方法,虽然很简单,但还是分享一下吧,用到时可以稍加修改和优化就可以使用. 获取指定目录下所有文件 //最要使用 System.IO.Directory.GetFil ...
- android 获取文件夹下的所有文件
昨天,在做工作时,需要遍历所有一个文件夹下的所有文件夹,当时自己也不知道怎么做,后来在网上搜索了一些资料,发现其实也很简单. 1.获取SD是否可以读写,如果可以,则传入文件的路径 /*读取输入的某个文 ...
- Python获取文件夹下的所有文件名
需求:主要是因为手动获取太麻烦了: 代码: import osdef get_file_name_list(file_dir):''':brief:获取文件夹下内,所有文件:param file_di ...
- python 获取文件夹所有文件列表_python获取文件夹下所有文件及os模块方法
python获取文件夹下所有文件 方法一:使用os.listdir import os for filename in os.listdir(r'c:\windows'): print filenam ...
- php获取文件夹下所有文件名(php遍历目录)
当我对接小发猫API的时候,需要php获取文件夹下所有文件名,我们有时候需要读取目录里面的内容,在 PHP 有多个函数可以获取文件系统目录信息,今天就给大家分享 PHP 遍历目录的三种方法. php获 ...
- Windows 下 C++ 利用 OpenCV glob 函数获取文件夹下所有文件绝对路径
绪论 本文记录 Windows 下 C++ 利用 OpenCv glob 函数得到 文件夹下所有文件的绝对路径(含文件名).本文还含有 std::string::find()等函数的记录.如果是 Py ...
- 【Windows】Windows10系统获取文件夹下的文件名方法
在工作过程中经常会碰到需要获得文件夹下文件名的情况,而如果手动获取的话,不仅太慢还很容易出错,这该怎么办呢?下面教大家在win10系统中快速获取文件夹下文件名的方法. 工具/原料 Windows10 ...
最新文章
- 检查值是否是JavaScript中的对象
- OpenCV-Python 雪花飘落特效
- 由单例模式造成的内存泄漏
- caffemodel的大小计算
- Pytorch 1.1.0驾到!小升级大变动,易用性更强,支持自定义RNN
- java random 种子数_JAVA:Random的种子含义
- Android测试方法总结汇总
- python不用模块随机列表_python不用库实现随机 如何用python实现随机抽取
- 什么是软件需求,软件需求的分类
- php简易微博系统,基于html、css、PHP开发一个简单的微型博客系统(微博)
- 在线考试系统html源码,jQuery在线答题考试系统代码
- 解决QQ 群共享无法打开,页面无法显示
- 可充电电池安规认证标准、GB 9706.1-2020对医用电气设备中电池的要求
- Debezium系列之:sqlserver数据库开启CDC
- 2021-3-2打砖块游戏,轮播图,swiper,自执行函数
- 肌营养不良2020-2021最新治疗突破 肌营养不良2021最新进展
- Docker简介与安装
- java-net-php-python-ssm二手手机交易平台查重PPT计算机毕业设计程序
- 大学生计算机学科竞赛a类,专业学科竞赛(A类)
- win10 死机 无响应
热门文章
- c语言判断闰年并输出该月天数,C语言宏定义实现闰年判断并输出指定月的天数...
- 用好这 43 款 Chrome 插件,让你开发学习一下子好轻松!
- xlsx表格怎么筛选重复数据_excel表格中如何筛选重复数据
- 国内/国外常见搜索引擎
- Maven子父工程依赖配置,小白也能看得懂
- Re10:读论文 Are we really making much progress? Revisiting, benchmarking, and refining heterogeneous gr
- win11怎么关闭触控板?win11关闭触控板的三种解决方法
- Vue + Echarts 正态分布图,在线计算标准差,生成正态分布曲线
- 信息系统与信息化、信息系统开发方法、常规信息系统集成技术
- java运行html代码,java代码运行html