iOS 图片压缩 内存泄漏解决

    xiaoxiao2026-08-12  2

    static size_t getAssetBytesCallback(voidvoid *info, voidvoid *buffer, off_t position, size_t count) {       ALAssetRepresentation *rep = (__bridge id)info;              NSError *error = nil;       size_t countRead = [rep getBytes:(uint8_t *)buffer fromOffset:position length:count error:&error];              if (countRead == 0 && error) {           // We have no way of passing this info back to the caller, so we log it, at least.           NDDebug(@"thumbnailForAsset:maxPixelSize: got an error reading an asset: %@", error);       }              return countRead;   }      static void releaseAssetCallback(voidvoid *info) {       // The info here is an ALAssetRepresentation which we CFRetain in thumbnailForAsset:maxPixelSize:.       // This release balances that retain.       CFRelease(info);   }      // Returns a UIImage for the given asset, with size length at most the passed size.   // The resulting UIImage will be already rotated to UIImageOrientationUp, so its CGImageRef   // can be used directly without additional rotation handling.   // This is done synchronously, so you should call this method on a background queue/thread.   - (UIImage *)thumbnailForAsset:(ALAsset *)asset maxPixelSize:(NSUInteger)size {       NSParameterAssert(asset != nil);       NSParameterAssert(size > 0);              ALAssetRepresentation *rep = [asset defaultRepresentation];              CGDataProviderDirectCallbacks callbacks = {           .version = 0,           .getBytePointer = NULL,           .releaseBytePointer = NULL,           .getBytesAtPosition = getAssetBytesCallback,           .releaseInfo = releaseAssetCallback,       };              CGDataProviderRef provider = CGDataProviderCreateDirect((voidvoid *)CFBridgingRetain(rep), [rep size], &callbacks);       CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, NULL);              CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef) @{                                                                                                         (NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,                                                                                                         (NSString *)kCGImageSourceThumbnailMaxPixelSize : [NSNumber numberWithInt:size],                                                                                                         (NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,                                                                                                         });       CFRelease(source);       CFRelease(provider);              if (!imageRef) {           return nil;       }              UIImage *toReturn = [UIImage imageWithCGImage:imageRef];              CFRelease(imageRef);              return toReturn;   }  
    转载请注明原文地址: https://ju.6miu.com/read-1311111.html
    最新回复(0)