2013-05-18 22 views
1

我想弄清楚如何在兩個圖像上分割帶有4個通道(r,g,b,a)的JPEG - 一個應該是帶有RGB信息的JPEG,另一個是隻有alpha通道的PNG。Xcode構建腳本來分離圖像通道?

+0

你到目前爲止嘗試過什麼? (另外,請將更多的精力放在您的問題上,並且只應用適當的標籤。) –

+0

Emmm ..不知道要增加什麼問題。我有4個通道的JPG,並希望在構建階段將其分成2個文件。所以要避免在Photoshop中保存2個文件,而只是通過xcode腳本從jpgs剪切alpha通道。我將有大約100個具有顏色信息和alpha通道的相似文件(黑白)。我想減少應用程序的大小,以避免節省大量PNG的透明度。與在構建期間從psd創建png和@ 2x.png的腳本類似。 –

+0

'JPEG'圖像不能包含alpha通道,所以你沒有(r,g,b,a)的'JPEG'。 –

回答

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); 
} 
+0

謝謝rptwsthi。但那不是我想要的。 –

+0

哦,毫無價值的努力:( – rptwsthi

1

你想要做的是下載ImageMagik包。它有大量的命令行程序,您可以在腳本中使用這些程序來執行圖像的「魔術」。

+0

謝謝。看起來這就是我真正需要的! –

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 

here約分離通道圖像。

Imagemagick在OSX上工作得很好。