C++读取图片数据

学习目标:

学习用C++读取图片


学习内容:

1、 下载codeblock编译器,用于运行C++
2、 C++读取图片文件

  • 采用文件流的方式
// read a file into memory
#include      // std::cout
#include       // std::ifstream

using namespace std;

int main () {
  // 1.Open picture file
  std::ifstream is ("C:\\Users\\admin\\Desktop\\test\\1.jpg", std::ifstream::binary);
  if (is) {
    // 2.get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    // 3.Create buffer
    char * buffer = new char [length];

    std::cout << "Reading " << length << " bits... \n";
    // 4.read data as a block:
    is.read (buffer,length);

    if (is)
      std::cout << "picture read successfully.";
    else
      std::cout << "error: only " << is.gcount() << " could be read";
    is.close();

    // ...buffer contains the entire file...

    delete[] buffer;
  }
  return 0;
}

C++读取图片数据_第1张图片

  • 文件操作(FILE)
FILE *in;

FILE操作是C语言常用的一种读取数据的一种方法;

FILE是在stdio.h中定义的结构体类型,封装了与文件有关的信息,如文件句柄、位置指针及缓冲区等,缓冲文件系统为每个被使用的文件在内存中开辟一个缓冲区,

用来存放文件的有关信息,这些信息被保存在一个FILE结构类型的变量中,in是一个指向FILE结构体类型的指针变量。

#include 
#include 
using namespace std;

int main(){
    FILE *in;
	// 1. 打开图片文件
	in = fopen("C:\\Users\\admin\\Desktop\\test\\1.jpg", "rb");
	if(in){
        // 2. 计算图片长度
        fseek(in, 0L, SEEK_END);
        int length =  ftell(in);
        fseek(in, 0L, SEEK_SET);
        // 3. 创建内存缓存区
        char * buffer = new char[length];
        // 4. 读取图片
        fread(buffer, sizeof(char), length, in);
        if (in)
          std::cout << "picture read successfully.";
        fclose(in);
        // 到此,图片已经成功的被读取到内存(buffer)中
        delete [] buffer;
	}
	return 0;
}

3、 用opencv读取图片

方法一:自己用Cmake编译opencv

安装教程:https://blog.csdn.net/wj_shi/article/details/99670132

安装参考博客:

https://blog.csdn.net/goomaple/article/details/45642499

https://blog.csdn.net/qq_41748900/article/details/86765420

cmake安装地址:cmake-3.10.3-win64-x64.zip

opencv安装地址:opencv-3.4.0-vc14_vc15

mingw安装地址:mingw-w64-v8.0.0

方法二:找到编译好的opencv文件;

最开始准备自己用Cmake编译opencv从而得到MinGW下使用的相关库文件,一直出错,最终找到该博主的方法(https://www.jianshu.com/p/c16b7c870356),用已经编译好的opencv文件,只需要解压,将环境变量配置好即可。

测试代码: 

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

int main()
{
    cout << "Hello world!" << endl;
    Mat img = imread("C:\\Users\\admin\\Desktop\\test\\1.jpg");
    imshow("test", img);
    cvtColor(img, img, CV_RGB2GRAY);
    imshow("gray", img);
    waitKey(0);
    return 0;
}

 测试结果:

C++读取图片数据_第2张图片

如果使用python,可以直接加载opencv库,即可调用opencv中的方法。


参考文献:

文件流读取:http://www.cplusplus.com/reference/istream/istream/read/

文件操作(FILE)与常用文件操作函数:https://www.cnblogs.com/lanhaicode/p/10320097.html

 

 

你可能感兴趣的:(c++)