2015-09-24 95 views
6

我面臨與裁剪與iOS9 SDK相關的幾個問題。ios9 - 問題與裁剪CVImageBuffer

我有以下代碼來調整圖像的大小(通過在中間裁剪從4:3轉換爲16:9)。這曾經工作得很好,直到iOS8 SDK。使用iOS 9時,底部區域爲空白。

(CMSampleBufferRef)resizeImage:(CMSampleBufferRef) sampleBuffer { 
    { 
     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
     CVPixelBufferLockBaseAddress(imageBuffer,0); 

     int target_width = CVPixelBufferGetWidth(imageBuffer); 
     int target_height = CVPixelBufferGetHeight(imageBuffer); 
     int height = CVPixelBufferGetHeight(imageBuffer); 
     int width = CVPixelBufferGetWidth(imageBuffer); 

     int x=0, y=0; 

     // Convert 16:9 to 4:3 
     if (((target_width*3)/target_height) == 4) 
     { 
      target_height = ((target_width*9)/16); 
      target_height = ((target_height + 15)/16) * 16; 
      y = (height - target_height)/2; 
     } 
     else 
     if ((target_width == 352) && (target_height == 288)) 
     { 
      target_height = ((target_width*9)/16); 
      target_height = ((target_height + 15)/16) * 16; 
      y = (height - target_height)/2; 
     } 
     else 
     if (((target_height*3)/target_width) == 4) 
     { 
      target_width = ((target_height*9)/16); 
      target_width = ((target_width + 15)/16) * 16; 
       x = ((width - target_width)/2); 
     } 
     else 
     if ((target_width == 288) && (target_height == 352)) 
     { 
      target_width = ((target_height*9)/16); 
      target_width = ((target_width + 15)/16) * 16; 
       x = ((width - target_width)/2); 
     } 

     CGRect cropRect; 

     NSLog(@"resizeImage x %d, y %d, target_width %d, target_height %d", x, y, target_width, target_height); 
     cropRect = CGRectMake(x, y, target_width, target_height); 
     CFDictionaryRef empty; // empty value for attr value. 
     CFMutableDictionaryRef attrs; 
     empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary 
            NULL, 
            NULL, 
            0, 
            &kCFTypeDictionaryKeyCallBacks, 
            &kCFTypeDictionaryValueCallBacks); 
     attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 
              1, 
              &kCFTypeDictionaryKeyCallBacks, 
              &kCFTypeDictionaryValueCallBacks); 

     CFDictionarySetValue(attrs, 
           kCVPixelBufferIOSurfacePropertiesKey, 
           empty); 

     OSStatus status; 
     CIImage *ciImage = [CIImage imageWithCVPixelBuffer:imageBuffer]; //options: [NSDictionary dictionaryWithObjectsAndKeys:[NSNull null], kCIImageColorSpace, nil]]; 
     CVPixelBufferRef pixelBuffer; 
     status = CVPixelBufferCreate(kCFAllocatorSystemDefault, target_width, target_height, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, attrs, &pixelBuffer); 
     if (status != 0) 
     { 
      NSLog(@"CVPixelBufferCreate error %d", (int)status); 
     } 

     [ciContext render:ciImage toCVPixelBuffer:pixelBuffer bounds:cropRect colorSpace:nil]; 
     CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 
     CVPixelBufferUnlockBaseAddress(imageBuffer,0); 

     CMSampleTimingInfo sampleTime = { 
      .duration = CMSampleBufferGetDuration(sampleBuffer), 
      .presentationTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer), 
      .decodeTimeStamp = CMSampleBufferGetDecodeTimeStamp(sampleBuffer) 
     }; 

     CMVideoFormatDescriptionRef videoInfo = NULL; 
     status = CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, &videoInfo); 
     if (status != 0) 
     { 
      NSLog(@"CMVideoFormatDescriptionCreateForImageBuffer error %d", (int)status); 
     } 
     CMSampleBufferRef oBuf; 
     status = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, true, NULL, NULL, videoInfo, &sampleTime, &oBuf); 
     if (status != 0) 
     { 
      NSLog(@"CMSampleBufferCreateForImageBuffer error %d", (int)status); 
     } 
     CFRelease(pixelBuffer); 
     ciImage = nil; 
     pixelBuffer = nil; 
     return oBuf; 
    } 
} 

關於此問題的任何建議或建議?我試圖改變裁剪矩形,但沒有效果。

感謝

+0

如果我保持x和y爲零,即x = 0 y = 0,它確實有效,但它不會從中間裁剪,而是刪除框架的頂部。 – manishg

回答

1

你知道該函數[CIContext toCVPixelBuffer: bounds: colorSpace:]的文檔註釋說,大約iOS8-和iOS9 +? (我還沒有發現任何在線資源鏈接,雖然)。

/* Render 'image' to the given CVPixelBufferRef. 
* The 'bounds' parameter has the following behavior: 
* In OS X and iOS 9 and later: The 'image' is rendered into 'buffer' so that 
*  point (0,0) of 'image' aligns to the lower left corner of 'buffer'. 
*  The 'bounds' acts like a clip rect to limit what region of 'buffer' is modified. 
* In iOS 8 and earlier: The 'bounds' parameter acts to specify the region of 'image' to render. 
*  This region (regarless of its origin) is rendered at upper-left corner of 'buffer'. 
*/ 

考慮考慮它我解決我的問題,它看起來和你的一樣。