实现图片的老旧、色彩、旋转效果
(1)使用 StoryBoard 故事版布局界面;

(2)使用 Core Image 框架的 CIFilter 过滤器;分别对应的过滤器名称是:CISepiaTone(棕黑色调)、CIHueAdjust(色彩调整)、CIStraightenFilter(纠正过滤器);

(3)另外就是使用 UIImagePickerController 来从图片库中选择图片,使用 ALAssetsLibrary 保存过滤器效果处理后的图片到图片库里。

图片处理过程:
1、创建基于 GPU的CIContext 对象实例
2、通过过滤器名称创建 CIFilter 对象实例
3、设置 CIFilter 对象实例参数
4、通过 CIFilter 对象实例的 outputImage 方法产生 CIImager 对象实例
5、通过 CIContext 对象实例的 createCGImage 方法将 CIImager 对象实例转换为 CGImageRef 对象实例
6、通过 UIImage 类的 imageWithCGImage 方法创建 UIImage 对象实例
7、绑定图片视图的图片为过滤器效果处理后的 UIImage 对象实例
8、使用 CGImageRelease 方法释放 CGImageRef 对象实例

关键操作:

效果如下:

iPhone 5s

iPhone 6

iPhone 6 Plus

ViewController.h

 1 #import <UIKit/UIKit.h>
 2 #import <AssetsLibrary/AssetsLibrary.h>
 3
 4 @interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
 5 @property (strong, nonatomic) IBOutlet UIImageView *imgVCustom;
 6 @property (strong, nonatomic) IBOutlet UISlider *sldSepiaTone;
 7 @property (strong, nonatomic) IBOutlet UISlider *sldHueAdjust;
 8 @property (strong, nonatomic) IBOutlet UISlider *sldStraightenFilter;
 9
10 @end

ViewController.m

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4 @property (strong, nonatomic) CIContext *context;
  5 @property (strong, nonatomic) CIImage *imgSource;
  6 @property (strong, nonatomic) CIFilter *filterSepiaTone;
  7 @property (strong, nonatomic) CIFilter *filterHueAdjust;
  8 @property (strong, nonatomic) CIFilter *filterStraightenFilter;
  9 - (void)layoutUI;
 10 - (void)displayImageWithFilter:(CIFilter *)filter;
 11 @end
 12
 13 @implementation ViewController
 14
 15 - (void)viewDidLoad {
 16     [super viewDidLoad];
 17
 18     [self layoutUI];
 19 }
 20
 21 - (void)didReceiveMemoryWarning {
 22     [super didReceiveMemoryWarning];
 23     // Dispose of any resources that can be recreated.
 24 }
 25
 26 - (void)layoutUI {
 27     //设置是否是连续性的;默认值为YES,表示拉动中也会触发Value Changed事件方法;这里我们设置为NO,在拉动后才触发
 28     _sldSepiaTone.continuous = NO;
 29     _sldHueAdjust.continuous = NO;
 30     _sldStraightenFilter.continuous = NO;
 31
 32     //得到图片路径创建CIImage对象实例
 33     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Big-Buck-Bunny-Clip" ofType:@"png"];
 34     NSURL *fileURL = [NSURL fileURLWithPath:filePath];
 35     _imgSource = [CIImage imageWithContentsOfURL:fileURL];
 36
 37     //创建基于CPU的CIContext对象实例
 38     //_context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];
 39
 40     //创建基于GPU的CIContext对象实例
 41     _context = [CIContext contextWithOptions: nil];
 42
 43     //创建过滤器
 44     _filterSepiaTone = [CIFilter filterWithName:@"CISepiaTone"]; //棕黑色调
 45     _filterHueAdjust = [CIFilter filterWithName:@"CIHueAdjust"]; //色彩调整
 46     _filterStraightenFilter = [CIFilter filterWithName:@"CIStraightenFilter"]; //纠正过滤器
 47 }
 48
 49 - (void)displayImageWithFilter:(CIFilter *)filter {
 50     //得到过滤后的图片
 51     CIImage *imgOutput = [filter outputImage];
 52
 53     //转换图片
 54     CGImageRef imgRef = [_context createCGImage:imgOutput fromRect:[imgOutput extent]];
 55     UIImage *imgNew = [UIImage imageWithCGImage:imgRef];
 56
 57     _imgVCustom.image = imgNew;
 58
 59     //释放CGImageRef对象实例
 60     CGImageRelease(imgRef);
 61 }
 62
 63 #pragma mark - IBAction
 64 - (IBAction)changeSepiaTone:(id)sender {
 65     _sldHueAdjust.value = 0.0;
 66     _sldStraightenFilter.value = 0.0;
 67     float slideVal = _sldSepiaTone.value;
 68
 69     //设置过滤器参数
 70     [_filterSepiaTone setValue:_imgSource forKey:kCIInputImageKey];
 71     [_filterSepiaTone setValue:[NSNumber numberWithFloat:slideVal] forKey:@"inputIntensity"];
 72
 73     [self displayImageWithFilter:_filterSepiaTone];
 74 }
 75
 76 - (IBAction)changeHueAdjust:(id)sender {
 77     _sldSepiaTone.value = 0.0;
 78     _sldStraightenFilter.value = 0.0;
 79     float slideVal = _sldHueAdjust.value;
 80
 81     //设置过滤器参数
 82     [_filterHueAdjust setValue:_imgSource forKey:kCIInputImageKey];
 83     [_filterHueAdjust setValue:[NSNumber numberWithFloat:slideVal] forKey:@"inputAngle"];
 84
 85     [self displayImageWithFilter:_filterHueAdjust];
 86 }
 87
 88 - (IBAction)changeStraightenFilter:(id)sender {
 89     _sldSepiaTone.value = 0.0;
 90     _sldHueAdjust.value = 0.0;
 91     float slideVal = _sldStraightenFilter.value;
 92
 93     //设置过滤器参数
 94     [_filterStraightenFilter setValue:_imgSource forKey:kCIInputImageKey];
 95     [_filterStraightenFilter setValue:[NSNumber numberWithFloat:slideVal] forKey:@"inputAngle"];
 96
 97     [self displayImageWithFilter:_filterStraightenFilter];
 98 }
 99
100 - (IBAction)resetImage:(id)sender {
101     //得到图片路径创建CIImage对象实例
102     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Big-Buck-Bunny-Clip" ofType:@"png"];
103     NSURL *fileURL = [NSURL fileURLWithPath:filePath];
104     _imgSource = [CIImage imageWithContentsOfURL:fileURL];
105
106     //重置滑杆值
107     _sldSepiaTone.value = 0.0;
108     _sldHueAdjust.value = 0.0;
109     _sldStraightenFilter.value = 0.0;
110     _imgVCustom.image = [UIImage imageWithContentsOfFile:filePath];
111 }
112
113 - (IBAction)chooseImage:(id)sender {
114     UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
115     imagePickerController.delegate = self;
116     [self presentViewController:imagePickerController
117                        animated:YES
118                      completion:^{
119                          //code
120                      }];
121 }
122
123 - (IBAction)saveImage:(id)sender {
124     CIFilter *filter;
125     if (_sldSepiaTone.value != 0.0) {
126         filter = _filterSepiaTone;
127     } else if (_sldHueAdjust.value != 0.0) {
128         filter = _filterHueAdjust;
129     } else {
130         filter = _filterStraightenFilter;
131     }
132
133     CIImage *imgOutput = [filter outputImage];
134     CGImageRef imgRefToSave = [_context createCGImage:imgOutput fromRect:[imgOutput extent]];
135
136     //需要导入头文件<AssetsLibrary/AssetsLibrary.h>
137     //保存到图片库中
138     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
139     [library writeImageToSavedPhotosAlbum:imgRefToSave
140                                  metadata:[imgOutput properties]
141                           completionBlock:^(NSURL *assetURL, NSError *error) {
142                               CGImageRelease(imgRefToSave);
143
144                               UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"提示信息"
145                                                                                message:@"保存成功"
146                                                                               delegate:nil
147                                                                      cancelButtonTitle:nil
148                                                                      otherButtonTitles:@"确定", nil];
149                               [alertV show];
150                           }];
151 }
152
153 #pragma mark - UIImagePickerControllerDelegate
154 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
155     [self dismissViewControllerAnimated:YES completion:nil];
156
157     UIImage *imgChoice = [info objectForKey:UIImagePickerControllerOriginalImage];
158     _imgSource = [CIImage imageWithCGImage:imgChoice.CGImage];
159     _imgVCustom.image = imgChoice;
160 }
161
162 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
163     [self dismissViewControllerAnimated:YES completion:nil];
164 }
165
166 @end

Main.storyboard

  1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
  3     <dependencies>
  4         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
  5     </dependencies>
  6     <scenes>
  7         <!--View Controller-->
  8         <scene sceneID="ufC-wZ-h7g">
  9             <objects>
 10                 <viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController">
 11                     <layoutGuides>
 12                         <viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
 13                         <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
 14                     </layoutGuides>
 15                     <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
 16                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
 17                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
 18                         <subviews>
 19                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Big-Buck-Bunny-Clip.png" translatesAutoresizingMaskIntoConstraints="NO" id="ReO-qZ-fAW">
 20                                 <rect key="frame" x="140" y="40" width="320" height="320"/>
 21                                 <constraints>
 22                                     <constraint firstAttribute="width" constant="320" id="C2r-Kz-KPF"/>
 23                                     <constraint firstAttribute="height" constant="320" id="dkB-gF-zbC"/>
 24                                 </constraints>
 25                             </imageView>
 26                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="老旧" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OWZ-rg-m0K">
 27                                 <rect key="frame" x="160" y="386" width="34" height="21"/>
 28                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
 29                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
 30                                 <nil key="highlightedColor"/>
 31                             </label>
 32                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="色彩" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="k3P-wv-puF">
 33                                 <rect key="frame" x="160" y="432" width="34" height="21"/>
 34                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
 35                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
 36                                 <nil key="highlightedColor"/>
 37                             </label>
 38                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="旋转" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uSa-M2-dak">
 39                                 <rect key="frame" x="160" y="477" width="34" height="21"/>
 40                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
 41                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
 42                                 <nil key="highlightedColor"/>
 43                             </label>
 44                             <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="za9-U7-UTZ">
 45                                 <rect key="frame" x="222" y="382" width="200" height="31"/>
 46                                 <constraints>
 47                                     <constraint firstAttribute="width" constant="196" id="5L7-au-P38"/>
 48                                     <constraint firstAttribute="height" constant="30" id="LTM-RW-tBZ"/>
 49                                 </constraints>
 50                                 <connections>
 51                                     <action selector="changeSepiaTone:" destination="vXZ-lx-hvc" eventType="valueChanged" id="s3f-rF-RWp"/>
 52                                 </connections>
 53                             </slider>
 54                             <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-3.1400000000000001" maxValue="3.1400000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="D5r-XT-NhQ">
 55                                 <rect key="frame" x="222" y="428" width="200" height="31"/>
 56                                 <constraints>
 57                                     <constraint firstAttribute="width" constant="196" id="E9q-ag-z5a"/>
 58                                     <constraint firstAttribute="height" constant="30" id="rfR-PP-ZFJ"/>
 59                                 </constraints>
 60                                 <connections>
 61                                     <action selector="changeHueAdjust:" destination="vXZ-lx-hvc" eventType="valueChanged" id="8mV-I5-bQo"/>
 62                                 </connections>
 63                             </slider>
 64                             <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-3.1400000000000001" maxValue="3.1400000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="SJf-EV-oYp">
 65                                 <rect key="frame" x="222" y="473" width="200" height="31"/>
 66                                 <constraints>
 67                                     <constraint firstAttribute="height" constant="30" id="MDv-9v-eTp"/>
 68                                     <constraint firstAttribute="width" constant="196" id="QPl-IW-Cr1"/>
 69                                 </constraints>
 70                                 <connections>
 71                                     <action selector="changeStraightenFilter:" destination="vXZ-lx-hvc" eventType="valueChanged" id="SQH-LR-ujT"/>
 72                                 </connections>
 73                             </slider>
 74                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0Te-5X-NMj">
 75                                 <rect key="frame" x="162" y="522" width="30" height="30"/>
 76                                 <state key="normal" title="重置">
 77                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
 78                                 </state>
 79                                 <connections>
 80                                     <action selector="resetImage:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="LA0-CK-Cax"/>
 81                                 </connections>
 82                             </button>
 83                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6cL-cO-scq">
 84                                 <rect key="frame" x="408" y="522" width="30" height="30"/>
 85                                 <state key="normal" title="保存">
 86                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
 87                                 </state>
 88                                 <connections>
 89                                     <action selector="saveImage:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="CeK-jp-JjI"/>
 90                                 </connections>
 91                             </button>
 92                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="RJd-TD-yLu">
 93                                 <rect key="frame" x="285" y="522" width="30" height="30"/>
 94                                 <state key="normal" title="照片">
 95                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
 96                                 </state>
 97                                 <connections>
 98                                     <action selector="chooseImage:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="ZaP-zL-bjr"/>
 99                                 </connections>
100                             </button>
101                         </subviews>
102                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
103                         <constraints>
104                             <constraint firstItem="RJd-TD-yLu" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="111" id="1Xc-pv-nf5"/>
105                             <constraint firstItem="ReO-qZ-fAW" firstAttribute="trailing" secondItem="6cL-cO-scq" secondAttribute="trailing" constant="22" id="2eD-1z-x0R"/>
106                             <constraint firstItem="za9-U7-UTZ" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="84" id="3NB-Bx-Q6O"/>
107                             <constraint firstItem="SJf-EV-oYp" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="84" id="83Z-cU-kxw"/>
108                             <constraint firstItem="RJd-TD-yLu" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="162" id="9gi-rx-JP8"/>
109                             <constraint firstItem="za9-U7-UTZ" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="22" id="Cvd-N5-JI2"/>
110                             <constraint firstItem="RJd-TD-yLu" firstAttribute="centerX" secondItem="ReO-qZ-fAW" secondAttribute="centerX" id="D1Y-sj-sEJ"/>
111                             <constraint firstItem="uSa-M2-dak" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="117" id="E87-nx-szc"/>
112                             <constraint firstItem="ReO-qZ-fAW" firstAttribute="leading" secondItem="D5r-XT-NhQ" secondAttribute="leading" constant="-84" id="X5f-S0-s32"/>
113                             <constraint firstItem="ReO-qZ-fAW" firstAttribute="leading" secondItem="6cL-cO-scq" secondAttribute="leading" constant="-202" id="YDf-6o-ael"/>
114                             <constraint firstItem="k3P-wv-puF" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="72" id="aR4-nO-nDR"/>
115                             <constraint firstItem="SJf-EV-oYp" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="113" id="b4C-YG-pCD"/>
116                             <constraint firstItem="ReO-qZ-fAW" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" constant="20" id="bDR-wl-gln"/>
117                             <constraint firstItem="OWZ-rg-m0K" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="20" id="eSk-OG-mwG"/>
118                             <constraint firstItem="6cL-cO-scq" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="162" id="fDO-my-Y2B"/>
119                             <constraint firstItem="0Te-5X-NMj" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="22" id="gnL-Tl-Gct"/>
120                             <constraint firstItem="k3P-wv-puF" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="20" id="iLD-r8-ys0"/>
121                             <constraint firstItem="OWZ-rg-m0K" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="26" id="l0h-GI-Jl5"/>
122                             <constraint firstItem="uSa-M2-dak" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="20" id="loZ-MY-9xZ"/>
123                             <constraint firstItem="D5r-XT-NhQ" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="68" id="ltH-7b-Knn"/>
124                             <constraint firstItem="RJd-TD-yLu" firstAttribute="leading" secondItem="ReO-qZ-fAW" secondAttribute="leading" constant="111" id="nPl-Q1-9VA"/>
125                             <constraint firstItem="0Te-5X-NMj" firstAttribute="top" secondItem="ReO-qZ-fAW" secondAttribute="bottom" constant="162" id="s8u-rt-ZdR"/>
126                             <constraint firstItem="ReO-qZ-fAW" firstAttribute="centerX" secondItem="kh9-bI-dsS" secondAttribute="centerX" id="t69-2F-C2v"/>
127                         </constraints>
128                         <variation key="default">
129                             <mask key="constraints">
130                                 <exclude reference="YDf-6o-ael"/>
131                                 <exclude reference="1Xc-pv-nf5"/>
132                                 <exclude reference="nPl-Q1-9VA"/>
133                             </mask>
134                         </variation>
135                     </view>
136                     <connections>
137                         <outlet property="imgVCustom" destination="ReO-qZ-fAW" id="24S-lL-ecd"/>
138                         <outlet property="sldHueAdjust" destination="D5r-XT-NhQ" id="AcU-Md-asg"/>
139                         <outlet property="sldSepiaTone" destination="za9-U7-UTZ" id="IJb-Zv-KEu"/>
140                         <outlet property="sldStraightenFilter" destination="SJf-EV-oYp" id="fvE-8k-f0f"/>
141                     </connections>
142                 </viewController>
143                 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
144             </objects>
145         </scene>
146     </scenes>
147     <resources>
148         <image name="Big-Buck-Bunny-Clip.png" width="320" height="230"/>
149     </resources>
150 </document>

转载于:https://www.cnblogs.com/huangjianwu/p/4584081.html

184使用 Core Image 框架处理照片相关推荐

  1. ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

    原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 ...

  2. Core Foundation框架

    转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...

  3. 《ASP.NET Core 3 框架揭秘(上下册)》送书结果公告

    [免费送书].Net5实操后的我一夜未眠,来个大胆预测!的送书抽奖结果已经出来了: 这位中奖的同学尽快填写收货地址,4/2 日还没有完成填写将作废,奖品可是热门的<ASP.NET Core 3 ...

  4. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  5. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  6. [ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?

    标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题.这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期. 一.问题重现 我们通过一个简单的实 ...

  7. .Net Core应用框架Util介绍(四)

    上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机. Angular应用由Ts和Html两部分构成,本文介绍第一部分. Angu ...

  8. .Net Core应用框架Util介绍(三)

    上篇.Net Core应用框架Util介绍(二)介绍了Util的开发环境,并让你把Demo运行起来.本文将介绍该Demo的前端Angular运行机制以及目录结构. 目录结构 在VS上打开Util De ...

  9. .Net Core应用框架Util介绍(二)

    Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...

最新文章

  1. Docker安装(Mac)
  2. linux中shell如何实现毫秒级别的sleep
  3. _新款福特F-150底价直售柔美线条硬朗风
  4. java反序列化漏洞 tomcat_CVE-2020-9484 Apache Tomcat反序列化漏洞浅析
  5. 利用反射做类参数的校验
  6. Incorrect string value: '/xE7/xA8/x8B/xE5/xBA/x8F...' for column 'course' at row 1
  7. 我也谈谈代码的性能测试及代码改进
  8. linux连接mysql_主机Navicat连接linux(虚拟机)的mysql数据库
  9. c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解
  10. Arduino IDE for ESP8266 项目(1) 点亮灯+按键LED+pwm
  11. Python高级用法:索引和切片
  12. 扒一扒有限元的那些书
  13. 许远东受邀上海管理科技论坛做《LTD数字化经营方法论》分享
  14. 在Java中为JFrame添加背景音乐
  15. 浅谈测试环境管理方式
  16. nividia 自定义分辨率整合进了显示器原生支持的分辨率,如何删除
  17. Rob Papen Go2 for Mac - 虚拟音频合成器
  18. Qt5实现可配置截图及基于百度OCR自动识别标题保存文件
  19. 外文文献阅读时切忌通读全文,这样做效率翻倍!
  20. 为什么程序员越跳槽收入越高?

热门文章

  1. 【Linux系统编程】进程和线程的区别
  2. 【Linux】一步一步学Linux——md5sum命令(61)
  3. [Qt教程] 第38篇 网络(八)TCP(二)
  4. 2011年全国软件大赛模拟题及参考答案(Java本科组)
  5. 在vscode上运行linux代码,在linux上安装VSCode
  6. 每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
  7. No space left on device 解决 Cydia 安装应用错误
  8. Android编译错误: The project cannot be built until build path errors are resolved
  9. MFC主线程使用WaitForSingleObject阻塞的问题
  10. VC INI文件读写 和 GetProfileString,WriteProfileString函数的使用