2013-04-10 3 views
2

Я написал свои собственные подборщики изображений, используя классы ALAssetsLibrary.ALAsset thumbnail имеют черный фон

Почти все в порядке, , но есть несколько изображений, имеющих черный фон, в то время как фактическое изображение является прозрачным/альфа-каналом.

Как исправить эту проблему?

Вот мое перечисление блок, в котором я имею загрузить изображение из ALAsset собственности эскиза:

[reversedItems enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { 
     UIImage *image = [UIImage imageWithCGImage:[[_assets objectAtIndex:allItems - idx] thumbnail]]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      GridView *gridView = (GridView *)obj; 
      gridView.imageView.image = image; 
     }); 
    }); 

}]; 
+0

имеют один и тот же вопрос, но попробуйте запустить приложение на устройстве IOS, на устройстве вы не должны видеть черный фон, кажется, что он появляется только в тренажере –

+0

на самом деле я вижу, что фон на устройстве. – h4cky

+1

Перейдите в файловую систему симулятора и найдите миниатюры, посмотрите, в каком формате они сохраняются. Насколько я помню, это jpeg или какой-либо другой формат, который не поддерживает альфа-канал. Я знаю, что список миниатюр в альбомах имеет tiff и не имеет альфа-канала. – TheBlack

ответ

1

Существует обходной путь, если вы используете fullScreenImage свойства, оно должно быть медленнее для выполнения, но он должен работать хорошо.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 
     ALAsset *asset = [_assets objectAtIndex:allItems - idx]; 
     UIImage *smallImage = [UIImage imageWithCGImage:[asset thumbnail]]; 
     UIImage *image; 

     CGSize size = [smallImage size]; 
     CGRect box = CGRectMake(0, 0, size.width, size.height); 


     UIGraphicsBeginImageContext(size); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]); 
     CGContextFillRect(context, box); 

     CGContextTranslateCTM(context, 0.0, size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 

     CGContextDrawImage(context, box, [[asset defaultRepresentation] fullScreenImage]); 

     image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 


     dispatch_async(dispatch_get_main_queue(), ^{ 
      TTGridView *gridView = (TTGridView *)obj; 
      gridView.imageView.image = image; 
     }); 
    }); 
+0

Да, это работает, но это очень медленно для производственных целей. – h4cky

Смежные вопросы