由于我不想进入的各种原因,我很方便将JPG的数据内联到源代码中。
所以不是通过常规API(例如[UIImage imageNamed:@"error.jpg"]
)加载图像,而是将JPG转换为base64字符串然后加载它:
+(NSString *)error_1 {
return @"/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAYqADAAQAAAABAAAAYgAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgAYgBiAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAHBwcHBwcMBwcMEQwMDBEXERERERcdFxcXFxcdIx0dHR0dHSMjIyMjIyMjKioqKioqMTExMTE3Nzc3Nzc3Nzc3P/bAEMBIiQkODQ4YDQ0YOacgJzm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5v/dAAQAB//aAAwDAQACEQMRAD8A6SqV5eJargcueg/qaLy8S1TA5c9B/U1zLu8jl3OWPU1LZ0UaPNq9i0dQuy27fj8BWxZXwuP3cmBIPyP0rmqUEqQQcEdDUpnVOjGStY7Wis2xvhcDy5OJB+taVaI8+UXF2YUUVFNNHBGZJDgD9aCUr6IJpo4IzJIcAfrXPS6lcyNlDsHYCoLm5kupNzcAdB6VWqGz0KVBRV5bm1Z6k27y7k8Ho3p9a3K4mtewv/LxBOfl7H09j7UJmdah9qJv0UUVZxn/0I9RJN4+e2P5CqNdPfWQuV3pw4HHv7VzTKyMVYYI6is2j0qM1KKSG0UUUjYUEqQQcEdDXR2N8LgeXJxIP1rm6UEqQQcEdDTTsZ1KamrM7CaaOCMySHAH61y9zcyXUm5uAOg9KbPcS3BBlOcDAqChu5nSo8ur3CiiikdAUUVp2NiZz5svEY/X/wCtQTKSirs1IGuPIjwP4R/Kpd1x6CrXTgUVdjh9t5H/0ekrPvbJbld6cSD9a0KKCoycXdHFsrIxVhgjqKbXTXtktyu9OJB+tc2ysjFWGCOorNqx6NOopobRRRSNQooooAKKK07GxM582XiMfr/9agmUlFXYWNiZz5svEY/X/wCtXRAADA4AoAAGBwBS1olY82pUc3dhRRRTMz//0ukooqKaaOCMySHAH60AlfRBNNHBGZJDgD9a5a5na5lMrADsAPSlubmS6k3NwB0HpVas27noUaPLq9wooopHQFFFFABXSWF6s6iF8BwOPQj2rm6UEqQQcEdDTTsZ1KamrM7Wis2xvhcDy5OJB+taVaI82UXF2YUUUUEn/9PfmmjgjMkhwB+tcvc3Ml1JubgDoPSrGpyM90UJ4TAA+ozWdUSZ30KSS5nuFFFFSdIUUVp2NiZz5svEY/X/AOtQTKSirszKK6a8sVnTdGArqOPQj0rm2VkYqwwR1FNqxFOoprQbRRRSNRQSpBBwR0NdHY3wuB5cnEg/WubpQSpBBwR0NNOxnUpqasztaKpxXW6JWYckAmpPtC+hq7nB7GR//9SzqVmxJuY+ePmH071iV21YV/YbczwDj+JR29xUNHZQrfZkY1FFadjYmc+bKMRj9f8A61SdUpKKuwsbEznzZeIx+v8A9auiAAGBwBQAAMDgClrRKx5tSo5u7Cs+9sluV3pxIP1rQopkxk4u6OLZWRirDBHUU2umvbJbld6cSD9a5tlZGKsMEdQazasejTqKaG1ZtraS6k2JwB1PpRbW0l1JsTgDqewrqIYY4IxHGMAfr7mhK5Faty6LcckaogRRwowPwp2BS0VpY4ed9z//1ekooooArNbwF8mNeT6CrNRn79SUkbVdkFFFFMxCiiigAqCaKJ/mdFY+pGanqOTpSZpS+IciKihUAUeg4p1A6UU0TLdhRRRQSf/Z";
}
+(UIImage *)img_error_1 {
NSData *d = [[NSData alloc] initWithBase64EncodedString:[self error_1] options:0];
return [UIImage imageWithData:d];
}
我知道这可能是一个可怕的事情,我是一个可怕的人,这是一个代码气味等等,但为了我的SDK的分发目的,它是非常简单的。
我感兴趣的是它如何影响SDK的内存/二进制大小以及它是否存在其他形式的问题。
我尝试了几个简单的测试,例如比较二进制大小,但没有发现它以极大的方式增加。我也尝试分析它的记忆,但无法得到具体答案(还有空白项目只包含图像数据或只有jpg)
有没有关于此的文献?
答案 0 :(得分:0)
无论这是好还是坏,您的担忧都在于可能会增加规模。与原始字节相比,Base64编码确实将字节大小增加了33%。将Base64字符存储为NSString
而不是8位字符串时,会有额外的增加。将两者都考虑在内,每三个字节的图像数据最终可能大约为8个字节。
另一种做同样事情的方法就是使用静态初始化的Byte
数组,例如:
static Byte imageData[] = { ... };
声明为全局级别(使用static
来停止在当前编译单元之外可用的标识符。)
要获取填充...
的字节,您可以在终端中使用hexdump
命令:
hexdump -v -e '16/1 "0x%02x, " "\n"' <myImage.jpg >myDump.txt
每行产生16个字节,以十六进制文字格式,逗号分隔。然后,您可以将#include
的内容粘贴(或myDump.txt
)到您的代码中。 hexdump
将NUL填充转储为16的倍数,因此您应检查myImage.jpg
的大小并删除最后的冗余0x0
。
您可以从生成NSData
,而无需复制内存:
NSData *d = [[NSdata alloc] dataWithBytesNoCopy:imageData
length:sizeof(imageData)
freeWhenDone:NO];
并从此继续。
HTH