আমি কীভাবে আইওএস 7 ব্লার ভিউয়ের মতো একটি প্রভাব তৈরি করতে পারি?


219

আমি অ্যাপলের প্রকাশ্যে প্রকাশিত আইওএস 7 উদাহরণ পর্দা থেকে এই অস্পষ্ট পটভূমিটি প্রতিলিপি দেওয়ার চেষ্টা করছি:

আইওএস 7 নিয়ন্ত্রণ কেন্দ্রের স্ক্রিনশট

এই প্রশ্নটি নীচের বিষয়বস্তুগুলিতে একটি সিআই ফিল্টার প্রয়োগ করার পরামর্শ দিচ্ছে, তবে এটি সম্পূর্ণ ভিন্ন পদ্ধতির। এটি স্পষ্টতই যে আইওএস 7 নীচের মতামতগুলির বিষয়বস্তু ক্যাপচার করে না, বহু কারণে:

  1. কিছুটা রুক্ষ পরীক্ষা করা, নীচের মতামতের একটি স্ক্রিনশট ক্যাপচার এবং আইওএস 7 এর অস্পষ্ট শৈলীর নকল করার জন্য যথেষ্ট পরিমাণে ব্যাসার্ধের সাথে সিআইজিউশিয়ান ব্লুর ফিল্টার প্রয়োগ করা সিমুলেটারেও 1-2 সেকেন্ড সময় নেয়।
  2. আইওএস 7 ব্লার ভিউটি কোনও লক্ষণীয় ল্যাগ ছাড়াই ডায়নামিক ভিউগুলিতে যেমন কোনও ভিডিও বা অ্যানিমেশনগুলিকে ঝাপসা করতে সক্ষম।

এই প্রভাব তৈরি করতে তারা কী ফ্রেমওয়ার্ক ব্যবহার করতে পারে এবং কেউ যদি বর্তমান পাবলিক এপিআইয়ের সাথে একই রকম প্রভাব তৈরি করা সম্ভব করে তবে কী কেউ অনুমান করতে পারেন?

সম্পাদনা: (মন্তব্য থেকে) অ্যাপল কীভাবে করছে তা আমরা ঠিক জানি না, তবে আমরা কী করতে পারি এমন কোনও মৌলিক অনুমান আছে? আমরা ধরে নিতে পারি যে তারা হার্ডওয়্যার ব্যবহার করছে, তাই না?

প্রভাবটি প্রতিটি দৃশ্যে স্ব-অন্তর্ভুক্ত থাকে, এমন প্রভাবটি আসলে জানেন না যে এর পিছনে কী রয়েছে? বা অবশ্যই, কীভাবে অস্পষ্টতা কাজ করে তার ভিত্তিতে এই অস্পষ্টতার পেছনের বিষয়বস্তু বিবেচনায় নেওয়া উচিত?

যদি প্রভাবটির পিছনের বিষয়বস্তু প্রাসঙ্গিক হয় তবে আমরা কি ধরে নিতে পারি যে অ্যাপল নীচের সামগ্রীর একটি "ফিড" গ্রহণ করছে এবং অবিচ্ছিন্নভাবে এগুলিকে একটি অস্পষ্টতার সাথে রেন্ডার করছে?


(আমি মনে করি আমরা ধরে নিতে পারি যে অ্যাপল যেভাবেই হোম স্ক্রিনগুলি রেন্ডার করতে খাঁটি জিএল ব্যবহার করছে I আমি সন্দেহ করি যে তারা এটি ইউআইভিউ এবং অন্যান্য জিনিসগুলির সাথে এটি বিমূর্ত করছে যা কার্যক্ষমতা হ্রাস পাবে, যেহেতু এটি ওএসের এইরকম একটি মূল অংশ)
ডেভ

আমি এখানে আমার উত্তরের মন্তব্যে যেমন ইঙ্গিত করেছি: স্ট্যাকওভারফ্লো.com / a / 17048668 / 19679 তারা ওএস লিখেছিল, অবশ্যই তারা বর্তমান দৃশ্যের নীচে মিশ্রিত স্তরগুলির বিষয়বস্তুগুলিতে ত্বরান্বিত অ্যাক্সেস পেতে চলেছে। আমরা কি তারা ব্যক্তিগত IOSurface এপিআই ব্যবহার করা যেতে পারে কিছু দেখতে পারেন stackoverflow.com/questions/14135215/... । গাউসিয়ান ব্লারগুলি সাধারণ গাউসিয়ান ব্লার কেসের তুলনায় আরও দ্রুত তৈরি করা যেতে পারে যদি তাদের একটি নির্দিষ্ট ব্যাসার্ধ থাকে, বা এমনকি ইন্টিগ্রাল ইমেজের মতো আকর্ষণীয় অপ্টিমাইজেশন ব্যবহার করা হয়।
ব্র্যাড লারসন

@ ব্র্যাডলারসন - জেসিকা সিম্পসনকে প্যারাফ্রেস করতে ... তার সমস্ত অর্থ কী তা আমার কোনও ধারণা নেই তবে হ্যাকের মতো এটি দুর্দান্ত মনে হচ্ছে! তবে মারাত্মকভাবে, আপনি কি বলছেন যে আপনি আ এ ব্লার ফিল্টার সহ আংশিক স্বচ্ছ দৃষ্টিভঙ্গিটি ব্যবহার করতে পারেন এবং এই প্রভাবটি অর্জনের জন্য এটি অন্য দৃশ্যের উপরে রেখে দিতে পারেন?
সাংগনি

stackoverflow.com/a/25706250/2308190 আমি প্রথমবার চেষ্টা করেছিলাম আমার জন্য পুরোপুরি কাজ করেছিল এবং সংক্ষিপ্ত ছিল
বেন হুইলার

উত্তর:


134

প্রভাব প্রতিলিপি কেন বিরক্ত? আপনার দর্শনের পিছনে কেবল একটি ইউআইটিুলবার আঁকুন।

myView.backgroundColor = [UIColor clearColor];
UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:myView.frame];
bgToolbar.barStyle = UIBarStyleDefault;
[myView.superview insertSubview:bgToolbar belowSubview:myView];

8
আমি ক্রিজওয়াল্ডের সাথে একমত নই। আমি মনে করি না যে এটি অ্যাপল কী করবে তার প্রত্যাশার নিয়মের একটি ভাল ব্যাখ্যা।
অ্যান্ড্রু জনসন

117
এই অ্যাপল ইউআইকিট ইঞ্জিনিয়ারের এই কৌশলটি আমি এই সপ্তাহে তাদের টেক টকস ল্যাবটিতে চালিয়েছি। যদিও তিনি অবশ্যই এই পদ্ধতির সমর্থন করবেন না, তিনি এর প্রয়োজনীয়তার প্রয়োজনীয়তা এবং এর জন্য প্রকৃত পাবলিক এপিআইয়ের অভাবকে স্বীকৃতি দিয়েছিলেন এবং বলেছিলেন যে এই পদ্ধতির আপাতত "ন্যূনতম মন্দ" বিকল্প ছিল এবং এটি লিখিতভাবে মোটামুটি নিরাপদ। বিশেষ করে তিনি বলেন কোন অ্যানিমেশন করতে চেষ্টা করবেন না frameবা transformএই সরঞ্জামদণ্ড / দৃশ্য বা ওই জাতীয় কিছু, বা খারাপ ব্যাপার ঘটতে হবে। তিনি এই বিষয়ে রাডার বাগ রিপোর্টগুলি ফাইল করার জন্য দৃ strongly়ভাবে পরামর্শ দিয়েছিলেন, অভ্যন্তরীণভাবে একটি মামলা তৈরি করতে যাতে আমরা এই প্রভাবটির জন্য একটি সত্যিকারের পাবলিক এপিআই পেতে পারি!
স্মাইলিবার্গ

44
আকর্ষণীয় ... দেখে মনে হচ্ছে @ ব্যবহারকারী 2342340 অ্যাকাউন্টটি বেনামে এই প্রশ্নের উত্তর দেওয়ার জন্য তৈরি করা হয়েছিল। আপনি কি ভাবছেন যে এই বিষয়গুলি সম্পর্কে আমাদের চেয়ে আরও বেশি জানে এমন কোনও ব্যক্তির যদি এটি অনানুষ্ঠানিক পোস্ট না হয় :)
স্মাইলিবার্গ

4
এটি আইফোন 4 চলমান আইওএস 7 এ কাজ করে না It এটি সম্ভবত আইফোন 4-তে, কারণ জিপিইউ শক্তিটি খুব কম, সিস্টেমটি UITabBarনিজেই এটির মধ্যে সাধারণ অস্পষ্টতা যুক্ত করে না ।
আয়ুশ গোয়েল

2
আমি কীভাবে এটি অ-সাদা করব? আমি যদি টুলবারের জন্য পটভূমির রঙ পরিবর্তন করি তবে এটি অস্পষ্টতা প্রদর্শন করে না।
নিকিতা পি

64

অ্যাপল ডাব্লুডব্লিউডিসিতে কোডটি ইউআইআইমেজে বিভাগ হিসাবে প্রকাশ করেছে যাতে এই কার্যকারিতাটি অন্তর্ভুক্ত থাকে, যদি আপনার কোনও বিকাশকারী অ্যাকাউন্ট থাকে তবে আপনি এই লিঙ্কটিতে গিয়ে ইউআইআইমেজ বিভাগ (এবং বাকি নমুনা কোডটি) ধরে নিতে পারেন: https://developer.apple। com / wwdc / वेळापत्रक / এবং বিভাগ 226 এর জন্য ব্রাউজিং এবং বিশদটি ক্লিক করুন। আমি এটির সাথে এখনও খেলিনি তবে আমি মনে করি এর প্রভাবটি আইওএস 6-তে অনেক ধীর হবে, আইওএস 7-র কিছু উন্নতি রয়েছে যা প্রাথমিক স্ক্রিন শটটি দখল করতে পারে যা ব্লারকে ইনপুট হিসাবে ব্যবহার করা হয় অনেক দ্রুত।

সরাসরি লিঙ্ক: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip


1
আমি ভিডিওটি দেখছি, আমি এটি দেখতে পারি, তবে নমুনা কোডটি কোথায় ডাউনলোড করতে হবে তা বুঝতে পারি না!
নাথান এইচ

সরল ব্যাকগ্রাউন্ডের আলফা পরিবর্তনের তুলনায় আমি খুব বেশি পার্থক্য দেখিনি; সম্ভবত এটি কারণ আমি ভিডিওগুলি প্রদর্শন করছি এবং তাদের কেবল আরও ঝাপসা দরকার ...
জ্যাক

37

আসলে আমি বাজি ধরতাম এটি অর্জন করা বরং সহজ হবে। এটি সম্ভবত পরিচালনা করবে না বা অ্যাপল যা চলছে তার মতো দেখতে লাগবে তবে খুব কাছাকাছি হতে পারে।

প্রথমত, আপনাকে যে ইউআইভিউ উপস্থাপন করা হবে তার সিজিআরেক্ট নির্ধারণ করা দরকার। একবার আপনি নির্ধারণ করে ফেললেন যে আপনার কেবলমাত্র ইউআই অংশের একটি চিত্র গ্রহণ করতে হবে যাতে এটি ঝাপসা হয়ে যায়। এটার মতো কিছু...

- (UIImage*)getBlurredImage {
    // You will want to calculate this in code based on the view you will be presenting.
    CGSize size = CGSizeMake(200,200);

    UIGraphicsBeginImageContext(size);
    [view drawViewHierarchyInRect:(CGRect){CGPointZero, w, h} afterScreenUpdates:YES]; // view is the view you are grabbing the screen shot of. The view that is to be blurred.
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Gaussian Blur
    image = [image applyLightEffect];

    // Box Blur
    // image = [image boxblurImageWithBlur:0.2f];

    return image;
}

গাউসিয়ান ব্লার - প্রস্তাবিত

অ্যাপলিকেশনটি এখানেUIImage+ImageEffects সরবরাহ করা বিভাগটি ব্যবহার করে , আপনি একটি গাউশিয়ান অস্পষ্টতা পাবেন যা আইওএস 7-এ অস্পষ্টর মতো দেখায়।

বক্স ব্লার

আপনি নিম্নলিখিত boxBlurImageWithBlur:ইউআইআইমেজ বিভাগটি ব্যবহার করে একটি ঝাপসা বাক্সও ব্যবহার করতে পারেন । এটি এমন একটি অ্যালগরিথেমের ভিত্তিতে যা আপনি এখানে খুঁজে পেতে পারেন ।

@implementation UIImage (Blur)

-(UIImage *)boxblurImageWithBlur:(CGFloat)blur {
    if (blur < 0.f || blur > 1.f) {
        blur = 0.5f;
    }
    int boxSize = (int)(blur * 50);
    boxSize = boxSize - (boxSize % 2) + 1;

    CGImageRef img = self.CGImage;

    vImage_Buffer inBuffer, outBuffer;

    vImage_Error error;

    void *pixelBuffer;

    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);

    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);

    pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));

    if(pixelBuffer == NULL)
        NSLog(@"No pixelbuffer");

    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);

    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

    if (error) {
        NSLog(@"JFDepthView: error from convolution %ld", error);
    }

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,
                                         outBuffer.width,
                                         outBuffer.height,
                                         8,
                                         outBuffer.rowBytes,
                                         colorSpace,
                                         kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

    //clean up
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);

    free(pixelBuffer);
    CFRelease(inBitmapData);

    CGImageRelease(imageRef);

    return returnImage;
}

@end

এখন আপনি পর্দার ক্ষেত্রটি অস্পষ্ট করার জন্য গণনা করছেন, এটিকে অস্পষ্ট বিভাগে পাঠিয়েছেন এবং অস্পষ্ট হওয়া একটি ইউআইআইমেজ ফিরে পেয়েছে, এখন যা কিছু বাকি রয়েছে তা হল সেই ঝাপসা চিত্রটি আপনি যে দৃশ্যের সাথে উপস্থাপন করবেন তার পটভূমি হিসাবে সেট করা। যেমনটি আমি বলেছিলাম, অ্যাপল যা করছে তার জন্য এটি একটি নিখুঁত ম্যাচ হবে না তবে এটি এখনও খুব দুর্দান্ত দেখাচ্ছে।

আশা করি এটা সাহায্য করবে.


মনে হচ্ছে ঝাপসা ইমেজের নীল রঙ এবং লাল রঙ স্যুপ আপ হয়েছে।
হেনরি

দেখে মনে হচ্ছে যে কেউ আপনার কোডটি এই প্রকল্পটি তৈরি করতে ব্যবহার করেছে: github.com/alexdrone/ios-realtimeblur/blob/master/RealTimeBlur/… তবে দুর্ভাগ্যক্রমে কোনও বিশেষণ নেই এবং তারা একটি "সর্বস্বত্ত্ব সংরক্ষিত" কপিরাইট বিবৃতি যুক্ত করেছেন উপরে.
মার্ক এর্ডম্যান

@ মার্ক, মাথা আপ জন্য ধন্যবাদ। তবে এই অস্পষ্ট আলগোরিদিমটি আমার নিজের নয়। আমি আমার পোস্টে এটি কোথা থেকে পেয়েছি তা ইতিমধ্যে উল্লেখ করেছি। যেমনটি আমার পোস্টে বলা হয়েছে "এটি একটি অ্যালগরিথামের উপর ভিত্তি করে তৈরি করা হয়েছে যা আপনি এখানে খুঁজে পেতে পারেন" " indieambitions.com/idevblogaday/… এর লিঙ্ক সহ আমি অবশ্যই এই ব্যক্তিকে একটি বার্তা পাঠাব এবং তাদের জানাতে পারি যে তারা অনুপস্থিতি হারিয়েছে। ধন্যবাদ
জেরেমি ফক্স

@ মার্কইর্ডম্যান আপনার নিজের ফাইলগুলি এক্সকোডে দেখুন। এটিতে "সর্বস্বত্ত্ব সংরক্ষিত" রয়েছে। এটি একটি সাধারণ জিনিস যা এক্সকোড যুক্ত করে। এছাড়াও লেখক স্রেফ একটি লাইসেন্স.এমডি যুক্ত করেছেন যা বলে যে এটি লাইট লাইসেন্সের আওতায় পড়েছে
সান্তা ক্লজ

ব্যবহার করবেন না renderInContext, নতুন drawViewHierarchyInRect:বা ব্যবহার করুন snapshotView:। ডাব্লুডাব্লুডিসি টক 216 "আইওএস 7-এ প্রেরণামূলক ইউআই বাস্তবায়ন" 5-15x পারফরম্যান্স উন্নতির দাবি করেছে।
bcattle

25

iOS8 এই প্রশ্নের উত্তর দিয়েছে।

UIVisualEffect

- (instancetype)initWithEffect:(UIVisualEffect *)effect

বা সুইফট:

init(effect effect: UIVisualEffect)


আমি অনুমান করি আইওএস 9 শেষ না হওয়া পর্যন্ত এই সমাধানটি বেশিরভাগই অকেজো। বেশিরভাগ অ্যাপ্লিকেশন আইওএস 7 সমর্থন করে এবং এই সমাধানটি সেখানে সমর্থিত নয়।
দিমিত্রি সোবোলেভ

সত্য সত্য, আপনি এই মুহুর্তের জন্য এই মুহুর্তটি
অ্যাডাম

আমি এটি iOS8 এর সাথে এক্সকোড 6 টি সরঞ্জামচেইনে প্রয়োগ করেছি এবং এটি দুর্দান্ত কাজ করে। আমি সিপিইউ ব্যবহার করে বাস্তবায়ন করার চেষ্টা করেছি, তবে এই পদ্ধতির তুলনায় লক্ষণীয়ভাবে ধীর কাজ করে।
জন

যখন কোডকোড স্টোরিবোর্ডে সরবরাহ করে তখন কেন !!!!! ধন্যবাদ @ অ্যাডামওয়েট
মিহির ওজা

20

আমি কেবলমাত্র ইউআইভিউর আমার ছোট্ট সাবক্লাসটি লিখেছি যাতে কোনও কাস্টম ভিউতে নেটিভ আইওএস 7 অস্পষ্টতা উত্পাদন করার ক্ষমতা রয়েছে। এটি ইউআইটিুলবার ব্যবহার করে তবে এটির ফ্রেম, সীমানা, রঙ এবং আলফাটি রিয়েল-টাইম অ্যানিমেশন সহ পরিবর্তনের জন্য নিরাপদ উপায়ে।

আপনার যদি কোনও সমস্যা লক্ষ্য করা থাকে তবে দয়া করে আমাকে জানান।

https://github.com/ivoleko/ILTranslucentView

আইএল ট্রান্সলুসেন্টভিউ উদাহরণ


আমি কিছু অন্যান্য পদ্ধতির চেষ্টা করেছি (যেমন একটি ইউআইটিউলবার নিজেকে যুক্ত করা, বা অ্যাপলের ইউআইআইমেজ + ইমেজএফেক্টস বিভাগ); আপনার সেরা এবং সহজ সমাধান ছিল। ধন্যবাদ!
ইউনুস নেদিম মেহেল

4
নতুন আইওএস 7.0.3 ডাউনলোডের ক্ষেত্রে এটি কতটা প্রতিক্রিয়া জানায়? অন্যান্য প্রযুক্তি যারা এই কৌশলটি ব্যবহার করেছে তারা আর সঠিকভাবে রেন্ডার করে না: [
আচি

@achi, আমি আইওএস 7.0.3 এর সাথে কোনও সমস্যা লক্ষ্য করিনি।
আইভো লেকো

আপনি কি জানেন যে কোনও অ্যাপস যা আপনার পদ্ধতির সাহায্যে অ্যানিমেট করে এবং অ্যাপল গ্রহণ করেছে?
ব্র্যাড গস

হাই বন্ধুরা হ্যাঁ, এই শ্রেণিটি ব্যবহার করে এমন অ্যাপ্লিকেশন অ্যাপল দ্বারা অনুমোদিত হবে!
ইভো লেকো

10

গুজব রয়েছে যে অ্যাপল ইঞ্জিনিয়াররা দাবি করেছেন, এই পারফরম্যান্টটি তৈরি করতে তারা সরাসরি জিপিইউ বাফারটি পড়ছেন যা সুরক্ষার সমস্যাগুলি উত্থাপন করে যার কারণে এটি করার জন্য কোনও পাবলিক এপিআই নেই।


6
যদি এটি সত্য হয় তবে তা - এখন পর্যন্ত - সবচেয়ে খারাপ সমাধান।
elslooo

2
আইএএএন্ড এবং অস্পষ্টতা iOS 7 থেকে মুছে ফেলা হয়েছে
কোড গুরু

3
এটি কেবলমাত্র এমন ডিভাইসে সরানো হয়েছিল যা পারফরম্যান্সের সমস্যাগুলি দেখছিল।
কোডি সি

24
এই পোস্টটি কি গুজবের উত্স? :)
জানো

11
সেই গুজব বোধহয় বোকা। আইওএসের ওপেনজিএল ইএস 2.0 আপনাকে কোনও সুরক্ষা ঝুঁকি ছাড়াই ফ্রেমব্রাফারগুলিকে পড়তে এবং লিখতে দেয়। অস্পষ্টতা জিএলএসএল শেডার ব্যবহার করে করা হয়, এ কারণেই এটি দ্রুত চলে।
বেন্টফোর্ড

7

এটি এমন একটি সমাধান যা আপনি ডাব্লুডাব্লুডিসির বিডিওগুলিতে দেখতে পাচ্ছেন। আপনাকে গাউসিয়ান ব্লার করতে হবে, তাই প্রথমে আপনাকে যা করতে হবে তা হচ্ছে আমি এখানে কোড লিখছি তার সাথে একটি নতুন .m এবং .h ফাইল যুক্ত করা, তারপরে আপনাকে তৈরি করতে হবে এবং স্ক্রিন অঙ্কুর করতে হবে, পছন্দসই প্রভাবটি ব্যবহার করতে হবে এবং এটিকে আপনার দর্শনে যুক্ত করুন, তারপরে আপনার ইউআইটিবেবল ইউআইভিউ বা যা কখনও স্বচ্ছ হতে হবে, আপনি পছন্দসই প্রভাবটি সংরক্ষণাগারভুক্ত করতে ব্লুউইথথ্র্যাডিয়াসের সাথে খেলতে পারেন, এই কলটি যে কোনও ইউআইআইমেজ নিয়ে কাজ করে।

শেষে অস্পষ্ট চিত্রটি পটভূমি হবে এবং উপরের সমস্ত নিয়ন্ত্রণগুলি স্বচ্ছ হতে হবে।

এটি কাজ করার জন্য আপনাকে পরবর্তী লাইব্রেরি যুক্ত করতে হবে:

Acelerate.framework, UIKit.framework, CoreGraphics.framework

আশা করি তুমি পছন্দ করেছ.

শুভ কোডিং।

    //Screen capture.
    UIGraphicsBeginImageContext(self.view.bounds.size);

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(c, 0, 0);
    [self.view.layer renderInContext:c];

    UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
    viewImage = [viewImage applyLightEffect];

    UIGraphicsEndImageContext();

    //.h FILE
    #import <UIKit/UIKit.h>

    @interface UIImage (ImageEffects)

   - (UIImage *)applyLightEffect;
   - (UIImage *)applyExtraLightEffect;
   - (UIImage *)applyDarkEffect;
   - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;

   - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;

   @end

    //.m FILE
    #import "cGaussianEffect.h"
    #import <Accelerate/Accelerate.h>
    #import <float.h>


     @implementation UIImage (ImageEffects)


    - (UIImage *)applyLightEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }


    - (UIImage *)applyExtraLightEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:0.97 alpha:0.82];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }


    - (UIImage *)applyDarkEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:0.11 alpha:0.73];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }


    - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor
    {
        const CGFloat EffectColorAlpha = 0.6;
        UIColor *effectColor = tintColor;
        int componentCount = CGColorGetNumberOfComponents(tintColor.CGColor);
        if (componentCount == 2) {
            CGFloat b;
            if ([tintColor getWhite:&b alpha:NULL]) {
                effectColor = [UIColor colorWithWhite:b alpha:EffectColorAlpha];
            }
        }
        else {
            CGFloat r, g, b;
            if ([tintColor getRed:&r green:&g blue:&b alpha:NULL]) {
                effectColor = [UIColor colorWithRed:r green:g blue:b alpha:EffectColorAlpha];
            }
        }
        return [self applyBlurWithRadius:10 tintColor:effectColor saturationDeltaFactor:-1.0 maskImage:nil];
    }


    - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage
    {
        if (self.size.width < 1 || self.size.height < 1) {
            NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@", self.size.width, self.size.height, self);
            return nil;
        }
        if (!self.CGImage) {
            NSLog (@"*** error: image must be backed by a CGImage: %@", self);
            return nil;
        }
        if (maskImage && !maskImage.CGImage) {
            NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
            return nil;
        }

        CGRect imageRect = { CGPointZero, self.size };
        UIImage *effectImage = self;

        BOOL hasBlur = blurRadius > __FLT_EPSILON__;
        BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__;
        if (hasBlur || hasSaturationChange) {
            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectInContext = UIGraphicsGetCurrentContext();
            CGContextScaleCTM(effectInContext, 1.0, -1.0);
            CGContextTranslateCTM(effectInContext, 0, -self.size.height);
            CGContextDrawImage(effectInContext, imageRect, self.CGImage);

            vImage_Buffer effectInBuffer;
            effectInBuffer.data     = CGBitmapContextGetData(effectInContext);
            effectInBuffer.width    = CGBitmapContextGetWidth(effectInContext);
            effectInBuffer.height   = CGBitmapContextGetHeight(effectInContext);
            effectInBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectInContext);

            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectOutContext = UIGraphicsGetCurrentContext();
            vImage_Buffer effectOutBuffer;
            effectOutBuffer.data     = CGBitmapContextGetData(effectOutContext);
            effectOutBuffer.width    = CGBitmapContextGetWidth(effectOutContext);
            effectOutBuffer.height   = CGBitmapContextGetHeight(effectOutContext);
            effectOutBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectOutContext);

            if (hasBlur) {
                CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale];
                NSUInteger radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5);
                if (radius % 2 != 1) {
                    radius += 1;
                }
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
            }
            BOOL effectImageBuffersAreSwapped = NO;
            if (hasSaturationChange) {
                CGFloat s = saturationDeltaFactor;
                CGFloat floatingPointSaturationMatrix[] = {
                    0.0722 + 0.9278 * s,  0.0722 - 0.0722 * s,  0.0722 - 0.0722 * s,  0,
                    0.7152 - 0.7152 * s,  0.7152 + 0.2848 * s,  0.7152 - 0.7152 * s,  0,
                    0.2126 - 0.2126 * s,  0.2126 - 0.2126 * s,  0.2126 + 0.7873 * s,  0,
                                  0,                    0,                    0,  1,
                };
                const int32_t divisor = 256;
                NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);
                int16_t saturationMatrix[matrixSize];
                for (NSUInteger i = 0; i < matrixSize; ++i) {
                    saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);
                }
                if (hasBlur) {
                    vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                    effectImageBuffersAreSwapped = YES;
                }
                else {
                    vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                }
            }
            if (!effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();

            if (effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }

        UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
        CGContextRef outputContext = UIGraphicsGetCurrentContext();
        CGContextScaleCTM(outputContext, 1.0, -1.0);
        CGContextTranslateCTM(outputContext, 0, -self.size.height);

        CGContextDrawImage(outputContext, imageRect, self.CGImage);

        if (hasBlur) {
            CGContextSaveGState(outputContext);
            if (maskImage) {
                CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);
            }
            CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);
            CGContextRestoreGState(outputContext);
        }

        if (tintColor) {
            CGContextSaveGState(outputContext);
            CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);
            CGContextFillRect(outputContext, imageRect);
            CGContextRestoreGState(outputContext);
        }

        UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return outputImage;
    }

7

আপনি এই পৃষ্ঠায় অ্যাপলের ডেমো থেকে সমাধানটি সন্ধান করতে পারেন: ডাব্লুডাব্লুডিসি 2013 , ইউআইআইমেজএফেক্টস নমুনা কোডটি সন্ধান করুন এবং ডাউনলোড করুন।

তারপরে @ জেরেমি ফক্সের কোড সহ। আমি এটা পরিবর্তন

- (UIImage*)getDarkBlurredImageWithTargetView:(UIView *)targetView
{
    CGSize size = targetView.frame.size;

    UIGraphicsBeginImageContext(size);
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(c, 0, 0);
    [targetView.layer renderInContext:c]; // view is the view you are grabbing the screen shot of. The view that is to be blurred.
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return [image applyDarkEffect];
}

আশা করি এটা তোমাকে সাহায্য করবে।


7

এখানে এটি করার একটি সহজ উপায়: https://github.com/JagCesar/iOS-blur

কেবল ইউআইটিুলবারের স্তরটি অনুলিপি করুন এবং আপনি শেষ করেছেন, এএমব্লিউরভিউ এটি আপনার জন্য করে। ঠিক আছে, এটি নিয়ন্ত্রণ কেন্দ্রের মতো অস্পষ্ট নয়, তবে এটি যথেষ্ট অস্পষ্ট।

মনে রাখবেন আইওএস 7 এনডিএর অধীনে।


6

এখানে প্রতিটি প্রতিক্রিয়া vImageBoxConvolve_ARGB8888 ব্যবহার করছে এই কার্যকারিতাটি সত্যই, ধীর, ঠিক আছে, যদি পারফরম্যান্স উচ্চ অগ্রাধিকারের প্রয়োজনীয়তা না হয় তবে আপনি যদি দুটি ভিউ কন্ট্রোলারের মধ্যে রূপান্তর করার জন্য এটি ব্যবহার করছেন (উদাহরণস্বরূপ) এই পদ্ধতির মানে 1 বারের বেশি দ্বিতীয় বা সম্ভবত আরও, এটি আপনার অ্যাপ্লিকেশনটির ব্যবহারকারীর অভিজ্ঞতার পক্ষে খুব খারাপ।

আপনি যদি এই সমস্ত চিত্র প্রক্রিয়াকরণটি জিপিইউতে রেখে যান (এবং আপনার হওয়া উচিত) তবে আপনি আরও অনেক ভাল প্রভাব পেতে পারেন এবং 50 মিমি চার্জ করার দুর্দান্ত সময়ও পেতে পারেন (ধরে নিন যে প্রথম পদ্ধতির মধ্যে আপনার 1 সেকেন্ড সময় রয়েছে), সুতরাং, এটি করা যাক ।

প্রথমে এখানে জিপিইউআইমেজ ফ্রেমওয়ার্ক (বিএসডি লাইসেন্সযুক্ত) ডাউনলোড করুন

এরপরে, জিপিইউআইমেজ থেকে নিম্নলিখিত ক্লাসগুলি (। মি এবং। ঘন্টা) যুক্ত করুন (আমি নিশ্চিত নই যে কেবলমাত্র অস্পষ্ট প্রভাবের জন্য এগুলি ন্যূনতম প্রয়োজনীয়)

  • GPUImage.h
  • GPUImageAlphaBlendFilter
  • GPUImageFilter
  • GPUImageFilterGroup
  • GPUImageGaussianBlurPositionFilter
  • GPUImageGaussianSelectiveBlurFilter
  • GPUImageLuminanceRangeFilter
  • GPUImageOutput
  • GPUImageTwoInputFilter
  • GLProgram
  • GPUImageBoxBlurFilter
  • GPUImageGaussianBlurFilter
  • GPUImageiOSBlurFilter
  • GPUImageSaturationFilter
  • GPUImageSolidColorGenerator
  • GPUImageTwoPassFilter
  • GPUImageTwoPassTextureSamplingFilter

  • আইওএস / GPUImage-Prefix.pch

  • আইওএস / GPUImageContext
  • আইওএস / GPUImageMovieWriter
  • আইওএস / GPUImagePicture
  • আইওএস / GPUImageView

এরপরে, ইউআইআইমেজে একটি বিভাগ তৈরি করুন, এটি একটি বিদ্যমান ইউআইআইমেজে একটি অস্পষ্ট প্রভাব যুক্ত করবে:

#import "UIImage+Utils.h"

#import "GPUImagePicture.h"
#import "GPUImageSolidColorGenerator.h"
#import "GPUImageAlphaBlendFilter.h"
#import "GPUImageBoxBlurFilter.h"

@implementation UIImage (Utils)

- (UIImage*) GPUBlurredImage
{
    GPUImagePicture *source =[[GPUImagePicture alloc] initWithImage:self];

    CGSize size = CGSizeMake(self.size.width * self.scale, self.size.height * self.scale);

    GPUImageBoxBlurFilter *blur = [[GPUImageBoxBlurFilter alloc] init];
    [blur setBlurRadiusInPixels:4.0f];
    [blur setBlurPasses:2.0f];
    [blur forceProcessingAtSize:size];
    [source addTarget:blur];

    GPUImageSolidColorGenerator * white = [[GPUImageSolidColorGenerator alloc] init];

    [white setColorRed:1.0f green:1.0f blue:1.0f alpha:0.1f];
    [white forceProcessingAtSize:size];

    GPUImageAlphaBlendFilter * blend = [[GPUImageAlphaBlendFilter alloc] init];
    blend.mix = 0.9f;

    [blur addTarget:blend];
    [white addTarget:blend];

    [blend forceProcessingAtSize:size];
    [source processImage];

    return [blend imageFromCurrentlyProcessedOutput];
}

@end

এবং সর্বশেষে, আপনার প্রকল্পে নিম্নলিখিত ফ্রেমওয়ার্কগুলি যুক্ত করুন:

এভিফাউন্ডেশন কোরমিডিয়া কোরভিডিও ওপেনগ্লিজ

হ্যাঁ, এই আরও দ্রুত পদ্ধতির সাথে মজা পেয়েছি;)


4

আপনি আমার কাস্টম ভিউটি ব্যবহার করে দেখতে পারেন, যা ব্যাকগ্রাউন্ড অস্পষ্ট করার ক্ষমতা রয়েছে has এটি অ্যাপল এর ডাব্লুডাব্লুডিসি কোডের মতোই ব্যাকগ্রাউন্ডের স্ন্যাপশট গ্রহণ করে এবং এটি ঝাপসা করে দিয়ে এটি করে। এটা ব্যবহার করা খুবই সহজ।

পারফরম্যান্সটি না হারিয়ে গতিশীল অস্পষ্টতার নকল করতে আমি কিছুটা উন্নতি করেছি। আমার দৃশ্যের পটভূমি হ'ল একটি স্ক্রোলভিউ যা এই দর্শন সহ স্ক্রোল করে, ততক্ষণ তত্ত্বাবধানের বাকি অংশগুলির জন্য অস্পষ্ট প্রভাব সরবরাহ করে।

আমার গিটহাবের উদাহরণ এবং কোড দেখুন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.