应用程序加毛玻璃蒙版保护账户信息

废话不多说,先来看看没有蒙版的效果 ,再来看看有蒙版的效果

 ,明显可以看出有明显的区别。

先说说实现的的思路:

当程序即将进入后台时,把当前屏幕截个图,此时要将图片毛玻璃化,并作为UIImageView的image,然后将imageView放在window的最上面,等即将进入前台时移除毛玻璃蒙版。

下面就来说代码实现吧(在代理文件中实现):

@interface AppDelegate ()
@property (nonatomic, weak)UIImageView *cover;
@end

主要代码:

- (void)applicationDidEnterBackground:(UIApplication *)application {

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:[UIApplication sharedApplication].keyWindow.bounds];
    self.cover = imgView;
    [[UIApplication sharedApplication].keyWindow addSubview:imgView];

    UIGraphicsBeginImageContext([UIApplication sharedApplication].keyWindow.size);
    // 将当前layer的截图写进上下中
    [[UIApplication sharedApplication].keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
    // 从上下中读取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  // 压缩图片,并转成JPEG类型
    NSData *imageData = UIImageJPEGRepresentation(image, 0.01);

    image = [UIImage imageWithData:imageData];
  // 注意:不能直接将图片毛玻璃化,要转成data后,再转成image,此时的image才能毛玻璃化,不然调用blurryImage:withBlurLevel会报错。
    imgView.image = [UIImage blurryImage:image withBlurLevel:0.15];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {

    [self.cover removeFromSuperview];
}

//下面代码是 blurryImage:withBlurLeve方法l的具体实现,我将它写成了UIImage的分类,所以可以直接用UIImage调用。

//加模糊效果,image是图片,blur是模糊度
+ (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {
    //模糊度,
    if ((blur < 0.1f) || (blur > 2.0f)) {
        blur = 0.5f;
    }

    //boxSize必须大于0
    int boxSize = (int)(blur * 100);
    boxSize -= (boxSize % 2) + 1;
    NSLog(@"boxSize:%i",boxSize);
    //图像处理
    CGImageRef img = image.CGImage;
    //需要引入#import <Accelerate/Accelerate.h>
    /*
     This document describes the Accelerate Framework, which contains C APIs for vector and matrix math, digital signal processing, large number handling, and image processing.
     本文档介绍了Accelerate Framework,其中包含C语言应用程序接口(API)的向量和矩阵数学,数字信号处理,大量处理和图像处理。
     */

    //图像缓存,输入缓存,输出缓存
    vImage_Buffer inBuffer, outBuffer;
    vImage_Error error;
    //像素缓存
    void *pixelBuffer;

    //数据源提供者,Defines an opaque type that supplies Quartz with data.
    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    // provider’s data.
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

    //宽,高,字节/行,data
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);

    //像数缓存,字节行*图片高
    pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));

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

    // 第三个中间的缓存区,抗锯齿的效果
    void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
    vImage_Buffer outBuffer2;
    outBuffer2.data = pixelBuffer2;
    outBuffer2.width = CGImageGetWidth(img);
    outBuffer2.height = CGImageGetHeight(img);
    outBuffer2.rowBytes = CGImageGetBytesPerRow(img);

    //Convolves a region of interest within an ARGB8888 source image by an implicit M x N kernel that has the effect of a box filter.
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
    error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

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

    //    NSLog(@"字节组成部分:%zu",CGImageGetBitsPerComponent(img));
    //颜色空间DeviceRGB
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    //用图片创建上下文,CGImageGetBitsPerComponent(img),7,8
    CGContextRef ctx = CGBitmapContextCreate(
                                             outBuffer.data,
                                             outBuffer.width,
                                             outBuffer.height,
                                             8,
                                             outBuffer.rowBytes,
                                             colorSpace,
                                             CGImageGetBitmapInfo(image.CGImage));

    //根据上下文,处理过的图片,重新组件
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

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

    free(pixelBuffer);
    free(pixelBuffer2);
    CFRelease(inBitmapData);

    CGColorSpaceRelease(colorSpace);
    CGImageRelease(imageRef);

    return returnImage;
}

Code4App里有详细的Demo:http://code4app.com/member/53908169933bf0c8238b4d43

时间: 2024-08-17 18:36:55

应用程序加毛玻璃蒙版保护账户信息的相关文章

毛玻璃蒙版

应用程序毛玻璃蒙版保护账户信息(如支付宝) 先说说实现的的思路: 当程序即将进入后台时,把当前屏幕截个图,此时要将图片毛玻璃化,并作为UIImageView的image,然后将imageView放在window的最上面,等即将进入前台时移除毛玻璃蒙版. 下面就来说代码实现吧(在代理文件中实现): 1 2 3 @interface AppDelegate () @property (nonatomic, weak)UIImageView *cover; @end 主要代码: - (void)app

其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常

其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常 解决方法 在 App.config 的 configuration 中加入下面的内容  其中 红底部分是你调用的Npgsql的版本号 <system.data> <DbProviderFactories> <remove invariant="Npgsql"/> <add name="Npgs

无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m

Windows服务中程序发布之后会如下错误: 无法为具有固定名称"System.Data.SqlClient"的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer".请确保使用限定程序集的名称且该程序集对运行的应用程序可用.有关详细信息,请参阅 http://go.microsoft.com

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调用Windows API的,那么今天我们就调用windowsAPI来写一个窗口程序 如果你有windows开发知识,那么就很理解了,如果没有,那么跟着我写,跟着步骤去写,那么也可以写出来 首先我们要编写一个窗口程序(使用SDKAPI编写)有几个步骤 1.设计窗口类 2.注

UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息

应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Github: https://github.com/validvoid/UWP-SystemInfoCollector 由于涉及内容较多,故本文会分为多篇展开.本篇介绍获取设备和系统的基本信息.应用包信息.用户数据账户信息和用户账户信息. 原博客阅读地址:http://validvoid.net/uwp-

记安装EP时在指定BCP账户信息时提示AOS无法访问的解决方法

因为卡在这个问题上好久,外加同事也有遇到,因此记下来! 环境:Windows Server 2012 R2 Standard + Dynamics AX 2012 R2 + SharePoint 2010 + MS SQL 2012 SP1 前提:机器已加域,且账户为域账户. 问题描述: 在安装Enterprise Portal(EP)时,在指定Business Connector proxy账户信息时,出现如下问题: 解决思路:[本文地址:http://www.cnblogs.com/Inte

.NET程序加壳的基本原理和方式浅析

.NET程序加壳的基本原理和方式浅析 加壳程序是一种常用的保护应用程序的办法,确切的说是一种加密办法.取名为壳,意思是说这种对程序的保护办法就像植物种子的外壳,咱们运用一段程序将咱们的主程序包裹在其间,不能轻易被其他人看见. 被加壳的程序在运转时先要运转一段附加的指令,这段附加的指令完结有关操作后会发动主程序. 加壳的办法大致可分为压缩和加密. 传统的非保管程序,加壳的目标是汇编指令:对.NET程序的加壳目标则是元数据和IL代码.对.NET程序的加壳,在理论和办法上并没有啥创新,目前都是直接承继

程序员眼睛的保护(爱护眼睛,你我做起)

程序员,怕是眼镜携带者的高发人群. 但是,如何让我们不再成为带着啤酒瓶厚度的眼镜,就真的靠平时的注意了. 以下,是网上看到的一些眼镜保护的信息. —————————— 1  修改编程字体大小 安装好编程软件,第一个要做的事情是修改字体大小.我一般是改成14pt,工具软件的默认字体值9pt太小了. 2 设置屏幕背景为润眼保护色 绿豆沙色能有效的减轻长时间用电脑的用眼疲劳,它的颜色默认值相关信息如下: 色调:85,饱和度:123,亮度:205: RGB颜色红:199,绿:237,蓝:204: 十六进

小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序加载事件)

在了解了PhoneGap中都有哪些事件之后,本节将开始对这些事件的用法进行详细地介绍.本节要介绍的是程序加载事件,也就是deviceready.pause和resume这3个事件. [范例4-2 程序加载事件的使用] 01 <!DOCTYPE html> 02 <html> 03 <head> 04 <meta charset="utf-8"> 05 <title>程序加载事件的使用</title> 06 <