2014-01-28 58 views
4

我使用以下方法從文件系統中獲取解壓縮的uiimage。但是,當我打開顏色混合圖層時,即使UIImageView設置爲「不透明」,UIImageView也會顯示爲紅色。從UIImage中刪除alpha通道

文件系統上的圖像不具有alpha通道。我試過設置CGContextSetAlpha(bitmapContext,1),但仍然有混合層。

任何人都知道如何使用CGContextDrawImage時取出alpha通道?

- (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刪除Alpha通道並不能真正提升性能,因爲它們在創建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

一般來說,答案是更有益的,如果他們有什麼樣的代碼是爲了做一個解釋,爲什麼在不介紹其他人的情況下解決問題(這篇文章被至少一個用戶標記,大概是因爲他們認爲沒有解釋的答案應該被刪除,我不能說我完全不同意這裏)。 –