2014-01-28 4 views
4

Я использую следующий метод для получения распакованного uiimage из файловой системы. Однако UIImageView окрашен в красный цвет, когда я включаю цветной смешанный слой, даже если UIImageView установлен в Opaque.Удалить альфа-канал из UIImage

Изображения в файловой системе не имеют альфа-канала. Я попробовал установить CGContextSetAlpha (bitmapContext, 1), но все еще имеет смешанный слой.

Кто-нибудь знает, как удалить альфа-канал при использовании CGContextDrawImage?

- (UIImage *)decompressedImage 
{ 
    CGImageRef imageRef = self.CGImage; 
    CGRect rect = CGRectMake(0.f, 0.f, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); 
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, 
                 rect.size.width, 
                 rect.size.height, 
                 CGImageGetBitsPerComponent(imageRef), 
                 CGImageGetBytesPerRow(imageRef), 
                 CGImageGetColorSpace(imageRef), 
                 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little 
                 ); 
    // kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little are the bit flags required 
    // so that the main thread doesn't have any conversions to do. 

    CGContextDrawImage(bitmapContext, rect, imageRef); 

    CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext); 
    UIImage* decompressedImage = [UIImage imageWithCGImage:decompressedImageRef 
                scale:[[UIScreen mainScreen] scale] 
               orientation:UIImageOrientationUp]; 
    CGImageRelease(decompressedImageRef); 
    CGContextRelease(bitmapContext); 

    return decompressedImage; 
} 

ответ

5

В опциях для контекста, попробуйте вариант

kCGImageAlphaNoneSkipLast 

или

kCGImageAlphaNoneSkipFirst 

В зависимости от того, если вы используете RGBA или ARGB

т.е.

CGContextRef bitmapContext = CGBitmapContextCreate(NULL, 
                 rect.size.width, 
                 rect.size.height, 
                 CGImageGetBitsPerComponent(imageRef), 
                 CGImageGetBytesPerRow(imageRef), 
                 CGImageGetColorSpace(imageRef), 
                 kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Little 
                 ); 
+0

Это работает. Хотя я не сильно улучшил производительность, рад видеть красные метки. Благодарю. – Jensen

+0

@Jensen Удаление альфа-канала не дает вам повышения производительности, потому что они в основном заполняют его для вас при создании UIImage. Вы получаете импульс меньших сжатых изображений, хотя так что все еще хорошая оптимизация :) – Jack

+0

Я только что обнаружил, что использование kCGImageAlphaNoneSkipLast потребляет гораздо больше памяти, чем при использовании kCGImageAlphaPremultipliedFirst. Есть ли у вас какие-либо идеи, что вызывает это? – Jensen

-6
-(void)JhagRemoveMethodRepet 
{ 

    switch (Jhagtag) 
    { 
     case 1: 
     { 

      if (jhag1.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag1.alpha; 
       jhag1.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:0 withObject:@"Mid"]; 
      }else 
      { 
      jhag1.alpha=0.0; 
      [JRemovetimer invalidate]; 
      JRemovetimer=nil; 
      [Checkjhag replaceObjectAtIndex:0 withObject:@"No"]; 
      [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 2: 
     { 

      if (jhag2.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag2.alpha; 
       jhag2.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:1 withObject:@"Mid"]; 

       if (jhagBrush==YES) 
       { 
        BTooth2.alpha=0.0; 
       } 
      }else 
      { 
       jhag2.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:1 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 3: 
     { 

      if (jhag3.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag3.alpha; 
       jhag3.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:2 withObject:@"Mid"]; 
      }else 
      { 
       jhag3.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:2 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 4: 
     { 
      if (jhag4.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag4.alpha; 
       jhag4.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:3 withObject:@"Mid"]; 
       if (jhagBrush==YES) 
       { 
        BTooth3.alpha=0.0; 
        SpiderMud.alpha=0.0; 
       } 
      }else 
      { 
       jhag4.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:3 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 5: 
     { 

      if (jhag5.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag5.alpha; 
       jhag5.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:4 withObject:@"Mid"]; 
      }else 
      { 
       jhag5.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:4 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 6: 
     { 
      if (jhag6.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag6.alpha; 
       jhag6.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:5 withObject:@"Mid"]; 
       if (jhagBrush==YES) 
       { 
        GreenMud.alpha=0.0; 
       } 
      }else 
      { 
       jhag6.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:5 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 7: 
     { 
      if (jhag7.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag7.alpha; 
       jhag7.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:6 withObject:@"Mid"]; 
      }else 
      { 
       jhag7.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:6 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 8: 
     { 
      if (jhag8.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag8.alpha; 
       jhag8.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:7 withObject:@"Mid"]; 

       if (jhagBrush==YES) 
       { 
        BTooth1.alpha=0.0; 
       } 
      }else 
      { 
       jhag8.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:7 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 9: 
     { 
      if (jhag9.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag9.alpha; 
       jhag9.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:8 withObject:@"Mid"]; 
      } 
      else 
      { 
       jhag9.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:8 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 10: 
     { 
      if (jhag10.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag10.alpha; 
       jhag10.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:9 withObject:@"Mid"]; 
      }else 
      { 
       jhag10.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:9 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 
     case 11: 
     { 
      if (jhag11.alpha>0.3) 
      { 
       float alpha1; 
       alpha1=jhag11.alpha; 
       jhag11.alpha=alpha1-0.1; 
       [Checkjhag replaceObjectAtIndex:10 withObject:@"Mid"]; 
       if (jhagBrush==YES) 
       { 
        Yellowmud.alpha=0.0; 
       } 
      }else 
      { 
       jhag11.alpha=0.0; 
       [JRemovetimer invalidate]; 
       JRemovetimer=nil; 
       [Checkjhag replaceObjectAtIndex:10 withObject:@"No"]; 
       [self checkcompeletewater]; 
      } 

     } 
      break; 

     default: 
      break; 
    } 

} 

-(void)checkcompeletewater 
{ 
    NSMutableArray *compeletearr=[NSMutableArray arrayWithObjects:@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No", nil]; 


    if ([Checkjhag isEqualToArray:compeletearr] && jhagBrush==YES) 
    { 
     waterClean=YES; 
     [self SoundPlay:@"puzzle_right"]; 
+4

Добавьте несколько комментариев в код и объясните это. В настоящее время это немного катастрофа. – fedorqui

+1

Как правило, ответы гораздо полезнее, если они содержат объяснение того, что должен делать код, и почему это решает проблему, не введя других. (Этот пост был отмечен хотя бы одним пользователем, по-видимому, потому, что они думали, что ответ без объяснений должен быть удален. Не могу сказать, что я совершенно не согласен здесь.) –

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