簡體   English   中英

從cvMat轉換為UIImage會改變圖像

[英]Converting to UIImage from cvMat alters image

每當我嘗試將二進制圖像轉換回UIImage它都會將應為白色的區域更改為深藍色。 我已經看到其他人也遇到了類似的問題,但是沒有找到解決方案。

這是我用來轉換為UIImage的代碼

- (UIImage *)UIImageFromMat:(cv::Mat)image
{

    NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()];

    CGColorSpaceRef colorSpace;

    if (image.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
    } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);//CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(image.cols,                                 //width
                                        image.rows,                                 //height
                                        8,                                          //bits per component
                                        8 * image.elemSize(),                       //bits per pixel
                                        image.step.p[0],                            //bytesPerRow
                                        colorSpace,                                 //colorspace
                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
                                        provider,                                   //CGDataProviderRef
                                        NULL,                                       //decode
                                        false,                                      //should interpolate
                                        kCGRenderingIntentDefault                   //intent
                                        );


    // Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    //[self.imgView setImage:finalImage];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return finalImage;

}

任何人都可以提供一些見解,以了解為什么我的代碼轉換為UIImage更改圖像嗎? 以及如何解決?

我不知道是什么原因,但是您可以使用

CGImageRef CGImageCreateWithMaskingColors (
   CGImageRef image,
   const CGFloat components[]
);

描述通過使用提供的顏色值遮罩現有的位圖圖像來創建位圖圖像。 顏色值為{c [1],... c [N]}的任何圖像樣本,其中min [i] <= c [i] <= max [i] for 1 <= i <= N是,未塗漆)。 這意味着未塗漆樣本下面的所有內容(例如當前填充顏色)都會顯示出來。

所以你需要像

UIImage *your_image; // do not forget to initialize it
const CGFloat blueMasking[6] = {0.0, 0.05, 0.0, 0.05, 0.95, 1.0};
CGImageRef image = CGImageCreateWithMaskingColors(your_image.CGImage, blueMasking);
UIImage *new_image = [UIImage imageWithCGImage:image];

https://stackoverflow.com/questions/22429538/turn-all-pixels-of-chosen-color-to-white-uiimage/22429897#22429897

發現我需要在轉換為UIImage之前應用此代碼

res.convertTo(res, CV_8UC3, 255.0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM