C 语言读取照片 RAW 数据源码

利用 C 读取照片 RAW 数据的一些注意点:

  • 搞清楚文件的数据类型(我的数据是12位的,所以用16位读取,转成8位,方便 opencv 显示数据)
  • 利用 fopen 打开文件
  • 利用 fread 读取文件(注意第二个和第三个参数的乘积是文件的大小即可)
  • 弄懂指针在矩阵数据中的应用(本文用了一维指针,raw[i] 和 *(raw+i)都表示第 i 个元素的值
  • 动态分配内存(因为你的数据大小可能随着不同的图片尺寸的变化而变化),用完释放内存,给野指针赋值

代码如下所示:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <stdlib.h>
#include <string.h>
#include <math.h>

using namespace std;
using namespace cv;

#define WIDTH         1920                    //数字图像水平像素个数
#define HEIGHT        1080                    //数字图像竖直像素个数

/******************************************************************************
* 功  能:打开文件
* 参  数:FilePath     I      文件地址
          pData        I      文件缓存指针
          raw          I/O    照片 raw 数据指针
* 返回值:1:正常退出;0:报错
******************************************************************************/
int OpenFile(const char      *FilePath,
             unsigned short  *pData,
	     unsigned char   *raw);


int OpenFile(const char      *FilePath,
             unsigned short  *pData,
	     unsigned char   *raw)
{       
	FILE *fp;       //文件指针
	int i = 0;      //循环变量

	fp = fopen(FilePath, "rb");

	if (NULL == pData)
	{
		/*如果没有输入数据则报错*/
		printf("读取数据失败\n");
		return 0;
	}

	fread(pData, 2, WIDTH * HEIGHT, fp);

	for (i = 0; i < HEIGHT * WIDTH; i++)
	{
		raw[i] = pData[i] >> 4;
	}

	fclose(fp);  //关闭文件夹

	return 1;
}

void main()
{
	/**************************为数据分配动态内存***************************/
	unsigned short *pData = (unsigned short *)malloc(sizeof(unsigned short) * WIDTH * HEIGHT); //为原始照片数据分配内存
        unsigned char *raw         = (UC08 *)malloc(sizeof(UC08) * WIDTH * HEIGHT); 

        /******************************初始化数据******************************/
	memset(pData,      0, sizeof(UC08) * WIDTH * HEIGHT);
        memset(raw,        0, sizeof(UC08) * WIDTH * HEIGHT);

        /*******************************读取 raw 数据**************************/
	char cOpenFilePath[] = "你的数据路径";
	OpenFile(OpenFilePath, pData, raw);
	Mat temp1(1080, 1920, CV_8UC1, raw);
	imwrite("图片储存路径和名称", temp1);
	printf("读取数据完成\n\n");

        /*****************************释放动态分配的内存************************/
	free(pData);
        free(raw);

        /*****************************为野指针赋空值****************************/
        pData = NULL;
        raw   = NULL;

        return;
}

 

参考资料:

《C Primer Plus  (第6版) 中文版》

 

C 语言 fopen 函数:https://baike.baidu.com/item/c%E8%AF%AD%E8%A8%80fopen%E5%87%BD%E6%95%B0/1775995?fr=aladdin

fread 函数:https://baike.baidu.com/item/fread/10942353

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值