I'm trying to figure out how to split JPEG with 4 channels(r,g,b,a) on two images - one should be JPEG with RGB information, other is PNG with only alpha channel in it.
问问题
207 次
3 回答
1
你要做的是下载 ImageMagik 包。它有大量的命令行程序,您可以在脚本中使用这些程序对图像进行“魔术”。
于 2013-05-18T12:51:41.170 回答
0
你想要一些可编写脚本的东西吗? Imagemagick包具有可以提取图像通道的转换实用程序:
convert rose: -channel R -separate separate_red.gif
convert rose: -channel G -separate separate_green.gif
convert rose: -channel B -separate separate_blue.gif
在此处阅读有关分离通道图像的信息。
Imagemagick 在 OSX 上运行良好。
于 2013-05-18T13:00:49.923 回答
0
您可以使用OpenCV来实现这一点,这是一个用于图像处理的开源库:
// NOTE you SHOULD cvReleaseImage() for the return value when end of the code.
- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4);
CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height,
iplimage->depth, iplimage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
cvCvtColor(iplimage, ret, CV_RGBA2BGR);
cvReleaseImage(&iplimage);
return ret;
}
//detecting blobs and drawing countours arround it
- (void) splitImage : (UIImage *) image {
if(!image)
return;
IplImage *iplImageFromImage = [self CreateIplImageFromUIImage:image];
cvSetImageROI(iplImageFromImage, cvRect(0, 0, image.size.width, image.size.height));
//splitting image detecting blob and then mergin it back
cout <<"channels = "<<iplImageFromImage->nChannels<<"\n";
IplImage *hImage, *sImage, *vImage, *fImage;
cvSplit(iplImageFromImage, &hImage, &sImage, &vImage, &fImage);
CvMat tmp; CvMat* mat = cvGetMat(iplImageFromImage, &tmp, 0, 0);
CvMat *hImage_m = cvCreateMat(mat->rows, mat->cols, CV_8UC1),
*sImage_m = cvCreateMat(mat->rows, mat->cols, CV_8UC1),
*vImage_m = cvCreateMat(mat->rows, mat->cols, CV_8UC1);
cvSplit(mat, hImage_m, sImage_m, vImage_m, NULL);
}
于 2013-05-18T11:20:03.190 回答