2013-10-16 31 views
1

我目前正在調整一些內部ImageSnap在嘗試臨時修改,以實時拍攝實時相機圖像的快照。我注意到,圖像調整大小得到,不考慮縱橫比,以及跟蹤的問題爲以下行:避免乾淨的光圈裁剪在CIImage imageWithCVImageBuffer

CVImageBufferRef frame; 
// obtain frame 
verbose("frame is %d x %d px\n", (int)CVPixelBufferGetWidth(frame), 
           (int)CVPixelBufferGetHeight(frame)); 
CIImage *ciimg = [CIImage imageWithCVImageBuffer:frame]; 
verbose("CIImage has %d x %d px\n", (int)[ciimg extent].size.width, 
            (int)[ciimg extent].size.height); 

至少對於我使用一個給定的裝置中,這些線的輸出是

frame is 1920 x 1080 px 
CIImage has 1888 x 1062 px 

顯然,圖像被調整大小,雖然我沒有看到任何代碼請求這種調整大小的一部分。從哪裏來,更重要的是,我該如何預防它?

我用下面的文檔,但在那裏找不到一個提示:


編輯:作爲據我所知,沒有縮放,而是裁剪正在進行,這是由於乾淨光圈設置mentioned in the Core Video Programming Guide。所以現在的問題是如何將這個乾淨的光圈設置爲全畫幅,或者如何避免轉換考慮到這一點。

回答

1

您可以

CVBufferRemoveAttachment(frame, kCVImageBufferCleanApertureKey); 

剝離出清晰光圈數據調用imageWithCVImageBuffer

+0

我不能在不久的將來測試這個,但我會簡單地假設它的工作,直到我真的可以試一試。謝謝! – MvG

0

從RosyWriter應用從蘋果前:

使用extendedWidth而不是寬度考慮可能的行擴展(有時用於內存對齊):

unsigned char *base = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer); 
size_t width = CVPixelBufferGetWidth(pixelBuffer); 
size_t height = CVPixelBufferGetHeight(pixelBuffer); 
size_t stride = CVPixelBufferGetBytesPerRow(pixelBuffer); 
size_t extendedWidth = stride/sizeof(uint32_t); // each pixel is 4 bytes/32 bits 

如果第一個建議沒有結果。