मुझे पता है कि आप इसे UIImageView के साथ कर सकते हैं, लेकिन क्या इसे UIImageView किया जा सकता है? मैं UIImageView की एनीमेशन इमेजेज एरे प्रॉपर्टी को एक ही इमेज की एक सरणी होना चाहता हूं, लेकिन अलग-अलग ओपेसिटीज के साथ। विचार?
जवाबों:
मुझे बस ऐसा करने की आवश्यकता थी, लेकिन सोचा कि स्टीवन का समाधान धीमा होगा। यह आशा है कि ग्राफिक्स HW का उपयोग करना चाहिए। UIImage पर एक श्रेणी बनाएँ:
- (UIImage *)imageByApplyingAlpha:(CGFloat) alpha {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
CGContextSetAlpha(ctx, alpha);
CGContextDrawImage(ctx, area, self.CGImage);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
इसके दृश्य की अस्पष्टता निर्धारित करें जो इसमें दिखाया गया है।
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"SomeName.png"]];
imageView.alpha = 0.5; //Alpha runs from 0.0 to 1.0
एक एनीमेशन में यह प्रयोग करें। आप एक अवधि के लिए एक एनीमेशन में अल्फा बदल सकते हैं।
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
//Set alpha
[UIView commitAnimations];
UIButton
, वास्तव में मुझे क्या चाहिए।
एलेक्सी इश्कोव के जवाब पर आधारित है, लेकिन स्विफ्ट में
मैंने UIImage क्लास के एक्सटेंशन का उपयोग किया।
स्विफ्ट 2:
UIImage एक्सटेंशन:
extension UIImage {
func imageWithAlpha(alpha: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
drawAtPoint(CGPointZero, blendMode: .Normal, alpha: alpha)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
काम में लाना:
let image = UIImage(named: "my_image")
let transparentImage = image.imageWithAlpha(0.5)
स्विफ्ट 3/4/5:
ध्यान दें कि यह कार्यान्वयन एक वैकल्पिक UIImage देता है। इसकी वजह है स्विफ्ट 3UIGraphicsGetImageFromCurrentImageContext
अब एक वैकल्पिक रिटर्न है। यदि संदर्भ शून्य है या क्या नहीं बनाया गया है, तो यह मान शून्य हो सकता है UIGraphicsBeginImageContext
।
UIImage एक्सटेंशन:
extension UIImage {
func image(alpha: CGFloat) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
draw(at: .zero, blendMode: .normal, alpha: alpha)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
काम में लाना:
let image = UIImage(named: "my_image")
let transparentImage = image?.image(alpha: 0.5)
Swift 3
संस्करण को पसंद करता हूं ।
बहुत आसान उपाय है:
- (UIImage *)tranlucentWithAlpha:(CGFloat)alpha
{
UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
[self drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:alpha];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
मुझे लगता है कि यह काफी देर हो चुकी है, लेकिन मुझे कुछ इस तरह की आवश्यकता थी इसलिए मैंने ऐसा करने के लिए एक त्वरित और गंदे तरीके को उड़ा दिया।
+ (UIImage *) image:(UIImage *)image withAlpha:(CGFloat)alpha{
// Create a pixel buffer in an easy to use format
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
UInt8 * m_PixelBuf = malloc(sizeof(UInt8) * height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(m_PixelBuf, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
//alter the alpha
int length = height * width * 4;
for (int i=0; i<length; i+=4)
{
m_PixelBuf[i+3] = 255*alpha;
}
//create a new image
CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGImageRef newImgRef = CGBitmapContextCreateImage(ctx);
CGColorSpaceRelease(colorSpace);
CGContextRelease(ctx);
free(m_PixelBuf);
UIImage *finalImage = [UIImage imageWithCGImage:newImgRef];
CGImageRelease(newImgRef);
return finalImage;
}
setImage:withAlpha:
image:withAlpha:
?
हे Xamarin उपयोगकर्ता से हे धन्यवाद! :) यहाँ यह c # के लिए अनुवादित है
//***************************************************************************
public static class ImageExtensions
//***************************************************************************
{
//-------------------------------------------------------------
public static UIImage WithAlpha(this UIImage image, float alpha)
//-------------------------------------------------------------
{
UIGraphics.BeginImageContextWithOptions(image.Size,false,image.CurrentScale);
image.Draw(CGPoint.Empty, CGBlendMode.Normal, alpha);
var newImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return newImage;
}
}
उपयोग उदाहरण:
var MySupaImage = UIImage.FromBundle("opaquestuff.png").WithAlpha(0.15f);
दूसरों के रूप में एक ही परिणाम, अलग शैली:
extension UIImage {
func withAlpha(_ alpha: CGFloat) -> UIImage {
return UIGraphicsImageRenderer(size: size).image { _ in
draw(at: .zero, blendMode: .normal, alpha: alpha)
}
}
}
स्विफ्ट 5:
extension UIImage {
func withAlphaComponent(_ alpha: CGFloat) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
defer { UIGraphicsEndImageContext() }
draw(at: .zero, blendMode: .normal, alpha: alpha)
return UIGraphicsGetImageFromCurrentImageContext()
}
}
यदि आप धातु प्रतिपादन के साथ प्रयोग कर रहे हैं और आप पहले उत्तर में imageByApplyingAlpha द्वारा उत्पन्न CGImage निकाल रहे हैं, तो आप एक धातु प्रतिपादन के साथ समाप्त हो सकते हैं जो आपकी अपेक्षा से बड़ा है। धातु के साथ प्रयोग करते समय, आप छवि में कोड की एक पंक्ति बदलना चाह सकते हैं।
UIGraphicsBeginImageContextWithOptions (self.size, NO, 1.0f);
// UIGraphicsBeginImageContextWithOptions (self.size, NO, 0.0f);
यदि आप iPhone 11 प्रो मैक्स की तरह 3.0 के पैमाने कारक के साथ एक उपकरण का उपयोग कर रहे हैं, तो ऊपर दिखाया गया 0.0 पैमाने कारक आपको एक CGImage देगा जो आपकी अपेक्षा से तीन गुना बड़ा है। स्केल फैक्टर को 1.0 में बदलने से किसी भी स्केलिंग से बचना चाहिए।
उम्मीद है, इस जवाब से शुरुआती लोगों को काफी नुकसान होगा।