1

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.

4

3 に答える 3

1

あなたがしたいことは、ImageMagik パッケージをダウンロードすることです。スクリプトで使用して画像を「魔法」にすることができるコマンドラインプログラムが多数あります。

于 2013-05-18T12:51:41.170 に答える
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 に答える
0

スクリプト可能なものが必要ですか? Imagemagickパッケージには、画像チャンネルを抽出できる convert ユーティリティがあります。

  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 に答える