/**
* 提取图像元数据
*
* @param filepath 图片路径,目前只支持jpg格式的图片
* @param convertToGray 是否转化为灰度图片
*
* @return cv::Mat
*/
cv::Mat ae_imageMatFromFile(constchar *filepath, bool convertToGray){
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen (filepath,"rb");
if (pFile == NULL)
return cv::Mat();
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {
fclose (pFile);
return cv::Mat();
}
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {
free (buffer);
fclose (pFile);
return cv::Mat();
}
fclose(pFile);
CFDataRef dataRef = CFDataCreate(NULL, (constunsigned char *)buffer, lSize);
free(buffer);
if (dataRef == NULL) {
return cv::Mat();
}
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(dataRef);
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider,NULL, true, kCGRenderingIntentDefault);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
int imageWidth = CGImageGetWidth(imageRef);
int imageHeight = CGImageGetHeight(imageRef);
// Creating temporal IplImage for drawing
IplImage *iplImage = cvCreateImage(cvSize(imageWidth, imageHeight), IPL_DEPTH_8U,4);
// Creating CGContext for temporal IplImage
CGContextRef contextRef = CGBitmapContextCreate(iplImage->imageData, iplImage->width, iplImage->height,
iplImage->depth, iplImage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
// Drawing CGImage to CGContext
CGContextDrawImage(contextRef,
CGRectMake(0,0, imageWidth, imageHeight),
imageRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
CGDataProviderRelease(imgDataProvider);
// Creating result IplImage
IplImage *retIplImage;
if (convertToGray) {
retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,1);
cvCvtColor(iplImage, retIplImage, CV_BGR2GRAY);
}
else{
retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,3);
cvCvtColor(iplImage, retIplImage, CV_RGBA2BGR);
}
cv::Mat imageMat = cv::Mat(retIplImage,true);
cvReleaseImage(&iplImage);
cvReleaseImage(&retIplImage);
return imageMat;
}

本文介绍了一种从文件中加载JPG格式图像的方法,并提供了将其转换为灰度图像的功能。该过程涉及文件读取、内存分配、使用Core Graphics库创建图像,以及使用OpenCV进行色彩空间转换。
653

被折叠的 条评论
为什么被折叠?



