YYKit-Example项目阅读——Progressive Image

736 阅读1分钟

YYKit源码学习笔记第二篇

正文

这是Example工程中Image的第二个展示项

效果

关于baseline、progressive、interlaced的区别可以参考这三篇:

  1. OpenCV将JPEG中的progressive类型转换成baseline类型
  2. 隔行扫描(interlaced)与逐行扫描(progressive)的图像对比
  3. 解除交错(需要梯子)
// 响应各控件事件的方法
- (void)changed {
    NSString *name = nil;
    if (_seg0.selectedSegmentIndex == 0) {
        if (_seg1.selectedSegmentIndex == 0) {
            name = @"mew_baseline.jpg";
        } else if (_seg1.selectedSegmentIndex == 1) {
            name = @"mew_baseline.png";
        } else {
            name = @"mew_baseline.gif";
        }
    } else {
        if (_seg1.selectedSegmentIndex == 0) {
            name = @"mew_progressive.jpg";
        } else if (_seg1.selectedSegmentIndex == 1) {
            name = @"mew_interlaced.png";
        } else {
            name = @"mew_interlaced.gif";
        }
    }
    
    NSData *data = [NSData dataNamed:name];
    float progress = _slider0.value;
    if (progress > 1) progress = 1;
    NSData *subData = [data subdataWithRange:NSMakeRange(0, data.length * progress)]; // 根据进度截取数据
    
    YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:[UIScreen mainScreen].scale];
    [decoder updateData:subData final:NO];
    YYImageFrame *frame = [decoder frameAtIndex:0 decodeForDisplay:YES];
    // 根据slider1的值对图片进行相应的模糊处理
    UIImage *image = [frame.image imageByBlurRadius:_slider1.value tintColor:nil tintMode:0 saturation:1 maskImage:nil];
    _imageView.image = image;
}

感悟

1. 虽然图片数据不完整,但我们仍可以呈现。

2. 不完整图片的呈现形式在这里有两种,baseline形式与progressive/interlaced形式。

3. 这个部分让我感悟最深的是ibireme的跨领域学习,在这里,他表现出对图片渲染的专业认识--可以从他的博客发现,他也擅长设计,这大概也是他被称为大神的原因之一。

4. 跨学科学习,有益无害。