孙同生的博客

为美好的世界献上祝福

  • 首页
  • 标签
  • 分类
  • 归档
  • d3学习demo演示
  • 搜索

iOS图片-位图信息与图片解码

发表于 2019-12-10 | 更新于 2020-01-15 | 分类于 iOS图片 | 评论数: | 阅读次数:
本文字数: 39k | 阅读时长 ≈ 36 分钟

介绍下几种iOS中位图信息 与相关解压缩
ref 谈谈 iOS 中图片的解压缩
ref Quartz 2D Programming Guide

我们从网络下载或者从本地磁盘加载一张图片到屏幕上显示,要经过图片的解码过程,为什么呢?因为我们一般的图片格式例如 JPEG,PNG都是经过压缩后的图片,而显示在屏幕上的图片叫做位图(bitmap),所谓的解码就是把压缩后的图片变成位图。

为什么非要解码成位图才能显示呢?因为位图又被叫做点阵图像,也就是说位图包含了一大堆的像素点信息,这些像素点就是该图片中的点,有了图片中每个像素点的信息,就可以在屏幕上渲染整张图片了。

那我们为什么还需要不同格式的各种图片呢?直接全部用位图不就好了?那不就不需要每次解码了?那些JPEG以及PNG等其实都是图像的压缩格式,我们都知道压缩的意思就是减小空间,所以我们可以想到,使用这些格式的原因就是位图实在太大了。

图片解压后的数据变化

阅读全文 »

iOS图片-最佳实践

发表于 2019-12-09 | 更新于 2020-01-15 | 分类于 iOS图片 | 评论数: | 阅读次数:
本文字数: 21k | 阅读时长 ≈ 19 分钟

介绍下 wwdc 2018 Image and Graphics Best Practices 中图片处理解压相关知识点
ref: Image and Graphics Best Practices

图片处理过程

一张图片从磁盘中显示到屏幕上过程大致如下:从磁盘加载原始压缩的图片信息、解码二进制图片数据为位图、渲染图片最终绘制到屏幕上。

在实际的渲染过程中,UIImage负责解压Data Buffer内容并申请buffer(Image Buffer)存储解压后的图片信息,然后UIImageView负责将Image Buffer 拷贝至 framebuffer,用于给显示硬件提供颜色信息。

解压过程是一个大量占用CPU资源的工作,因此UIImage 会retain存储解压后信息的Image Buffer以便给重复的渲染工作提供信息,Image Buffer与图片的实际尺寸有关(理论值为height * width * 4 bytes),与图片文件大小无关。若是在TableView等列表中连续加载多张图片,便会引发连续的大块内存分配,这将对Memory和CPU带来沉重的负担。

阅读全文 »

iOS图片-ImageIO介绍

发表于 2019-12-06 | 更新于 2020-01-15 | 分类于 iOS图片 | 评论数: | 阅读次数:
本文字数: 28k | 阅读时长 ≈ 25 分钟

介绍下iOS中ImageIO的概览与应用
Image I/O Programming Guide

介绍

ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO具有很多特性 Mac平台上最快的图像解码器和编码器 逐步加载图像的能力``支持图像元数据 有效缓存 ImageIO框架中包含6个头文件:

  1. ImageIO.CGImageAnimation
  2. ImageIO.CGImageDestination 负责写入图片数据。
  3. ImageIO.CGImageMetadata 图片文件元数据类
  4. ImageIO.CGImageProperties 定义了框架中使用的字符串常量和宏。
  5. ImageIO.CGImageSource 负责读取图片数据。
  6. ImageIO.ImageIOBase 预处理逻辑
阅读全文 »

iOS图片-图片缩略方法

发表于 2019-12-04 | 更新于 2020-01-15 | 分类于 iOS图片 | 评论数: | 阅读次数:
本文字数: 19k | 阅读时长 ≈ 18 分钟

介绍下在iOS中的多种图片缩略方式
ref https://nshipster.com/image-resizing/

在UIKit CoreGraphics ImageIO CoreImage vImage多种缩略方法中 Core Image表现最差。Core Graphics 和 Image I/O最好。

实际上,在苹果官方在 Performance Best Practices section of the Core Image Programming Guide 部分中特别推荐使用Core Graphics或Image I / O功能预先裁剪或缩小图像。

阅读全文 »

fishhook源码学习

发表于 2019-05-08 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 24k | 阅读时长 ≈ 22 分钟

上一篇 Mach-O应用 fishhook动态修改C函数 了解了fishhook的原理,现在来看一下它的代码,看它是如何一步一步替换原有函数实现的。

阅读全文 »

Mach-O应用 fishhook动态修改C函数

发表于 2019-04-29 | 更新于 2019-05-08 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 15k | 阅读时长 ≈ 13 分钟

fishhook简介

C 语言往往会给我们留下不可修改的这一印象,而 fishhook 是一个由 facebook 开源的第三方框架,其主要作用就是动态修改 C 语言函数实现。

这个框架的代码其实非常的简单,只包含两个文件:fishhook.c 以及 fishhook.h;两个文件所有的代码加起来也不超过 300 行。不过它的实现原理是非常有意思并且精妙的

fishhook 提供非常简单的两个接口以及一个结构体:

1
2
3
4
5
6
7
8
9
10
11
struct rebinding {
const char *name;
void *replacement;
void **replaced;
};

int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel);

int rebind_symbols_image(void *header,intptr_t slide,
struct rebinding rebindings[],
size_t rebindings_nel);

我们可以从 fishhook 提供的demo中上手实践一下,这里的demo对 close 进行修改:

阅读全文 »

Mach-O文件格式字段简介

发表于 2019-04-18 | 更新于 2020-02-07 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 31k | 阅读时长 ≈ 28 分钟

概览

本次来学习下Mach-O文件的格式,Mach-O(Mach Object File Format) 是针对不同运行时可执行文件的文件类型。

文件类型:

Executable: 应用的主要二进制
Dylib: 动态链接库(又称 DSO 或 DLL)
Bundle: 不能被链接的 Dylib,只能在运行时使用 dlopen() 加载,可当做 macOS 的插件。

Mach-O 文件格式如下:

阅读全文 »

iOS编译过程

发表于 2019-04-10 | 更新于 2019-04-23 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 55k | 阅读时长 ≈ 50 分钟

编译器

把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序叫做编译器

大多数编译器由两部分组成:前端和后端。

  • 前端负责词法分析,语法分析,生成中间代码;
  • 后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码。

Objective C/C/C++使用的编译器前端是clang,swift是swift,后端都是LLVM。

llvm介绍

LLVM是什么,是low level virtual machine的简称,其实是一个编译器框架。LLVM 的优点主要得益于它的三层式架构 – 第一层支持多种语言作为输入(例如 C, ObjectiveC, C++ 和 Haskell),第二层是一个共享式的优化器(对 LLVM IR 做优化处理),第三层是许多不同的目标平台(例如 Intel, ARM 和 PowerPC)。编译器前端主要进行语法分析,语义分析,生成中间代码。编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化,根据不同的系统架构生成不同的机器码。

现在,Xcode 的默认编译器是 clang。本文中我们提到的编译器都表示 clang。clang 的功能是首先对 Objective-C 代码做分析检查,然后将其转换为低级的类汇编代码:LLVM Intermediate Representation(LLVM 中间表达码)。接着 LLVM 会执行相关指令将 LLVM IR 编译成目标平台上的本地字节码,这个过程的完成方式可以是即时编译 (Just-in-time),或在编译的时候完成。而Clang 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。Clang项目包括Clang前端和Clang静态分析器等。

下图是iOS编译过程:

阅读全文 »

LLDB教程-命令篇

发表于 2019-03-14 | 更新于 2019-04-23 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 25k | 阅读时长 ≈ 23 分钟

你是否曾经苦恼于理解项目的代码,而去尝试打印一个变量的值?然后使用NSLog 并且每次必须重新编译,从头开始?但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。

LLDB 是什么?

LLDB是Mac OS X上Xcode的默认调试器,支持再桌面和iOS设备和模拟器上调试C ,Objective-C和C++。它是新一代高性能调试器,它可以高效利用LLVM项目中的现有库,例如Clang表达式解析器和LLVM反汇编程序。

随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板。

Chisel 是facebook下一个开源LLDB命令集合。

与此同时,让我们以在调试器中打印变量来开始我们的旅程吧。

阅读全文 »

iOS直播教程

发表于 2019-03-07 | 分类于 quick-start | 评论数: | 阅读次数:
本文字数: 10k | 阅读时长 ≈ 9 分钟

直播原理

一个简单的直播流程是:

1
2
app        -> 视频采集   ->  编码    -> 推流     -> 服务器
服务器 -> 拉流 -> 解码 -> 播放 -> app

其中涉及到的技术点比较多:

阅读全文 »
<i class="fa fa-angle-left" aria-label="上一页"></i>1234…9<i class="fa fa-angle-right" aria-label="下一页"></i>
SunTongSheng

SunTongSheng

移动端 前端 跨平台

85 日志
22 分类
27 标签
RSS
© 2026 SunTongSheng | 532k | 8:04