腾讯云Mac图床插件

背景

随着博客越写越多,难免会遇到需要插入图片来说明的情况。

图床选择

首先调研了市面上的图床服务,本着稳定长期的目标,过滤掉了打一枪换一个地方的野鸡小网站,剩余比较靠谱的优缺点如下。

图床 优点 缺点
腾讯云 免费 无需域名 未来可能会收费
七牛 免费 需要域名和备案
又拍云 免费 无需域名 未来可能会收费
阿里云 目前最完备 收费 需要域名
微博 免费 无需域名 不稳定 匿名上传

作为一个刚起步的小博客,应该把精力更多关注于内容,以后再考虑域名备案或者大流量套餐,因此尽量选择免费的图床。 其实是穷

微博作为国内首屈一指的流量大户,其图床的CDN和质量肯定没有问题,但是上传图片会自带水印,且匿名上传总觉得不靠谱。

剩下的选择还有两个,又拍云进军对象存储领域比腾讯云早而且更成熟,但是就规模和技术来说,我还是更愿意相信腾讯。

工具

注册完腾讯云账号后,下一个问题就是怎么更方便的将图床与 MarkDown 结合起来使用,提高效率和体验。

iPic 完美符合我的需求,这是一款 Mac 上的状态栏软件,支持上传本地图片到设定的图床,获取图片地址后按照 ![](url) 格式复制到剪贴板。

那么好的应用为啥不用呢?

因为不想按年交钱。应用默认是微博图床,如果要使用其他图床就需要购买专业版,每年60元。如果是一次买断的话,也就买了,年费心里总有疙瘩 矫情

突然,我就想到! 自己开发一个! 闲的蛋疼

开发iPhone应用已经好多年了,还从未开发过Mac上的状态栏软件,正好还能锻炼下Swift,于是说干就干。没想到开发了一个月


需求设计

产品使用逻辑基本与 iPic 一致,基于状态栏交互,选择png jpg文件上传。

可以设置是否压缩图片,压缩会压到500K以下。

还需要有一个登录界面记录腾讯云的账号和存储库信息。

文件上传成功后,弹出通知提醒,并复制到剪贴板。

如果不慎复制了其他文本导致丢失了链接,再点击一次通知就可以重新获取。


遇到的难题

Swift

第一关就是编程语言。

虽然也曾系统的学过Swift,但由于常年使用Objective-C 开发,思维方式还转不过来。

严格的空变量

比较明显的区别就是处理空变量的方式。

ObjC中,指针变量可以是nil(也就是0),对nil执行方法不会发生任何事情,因此可以算是部分安全。

Swift对待空变量更严格,!修饰的变量必须有具体值,?修饰的变量才具有空值的可能性。

nil不再表示为空对象,而是一个空值,向空值调用方法会导致闪退。对待?修饰的变量必须要小心,最好先判断是否有值再使用,好在有语法糖可以解决这类问题。

//默认为nil
var money : String?
//变量有值
money = "million"

//判断肯定有值后再使用
if money != nil {
    print("I have \(money!) dollars.")
}

//保证变量有值并赋值给安全变量后执行
if let account = money {
    print("I have \(account) dollars.")
}

//变量如果没有值就执行else事件并return
guard let account = money else {
    print("I have no money.")
}

print("I have \(account) dollars.") 

合理使用! ? 会使我们的代码更安全与简洁。

Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。

抛出警告

ObjC@throw 的用法,但是根据苹果官方的描述,执行的成本很大。究其原因在于 ObjC 基于 C 语言而不是 C++,所以只能使用 setjmp()longjmp() 方法实现,因此可能会造成内存泄漏。

Important: Exceptions are resource-intensive in Objective-C. You should not use exceptions for general flow-control, or simply to signify errors (such as a file not being accessible)

Swift 从根本解决了这个问题,并结合枚举优化了整个流程。

enum CompressError : Error {
    case NoImage
    case OverSize(size : Int)
}

func compressImage(_ imageData: Data?) throws -> Data? {
        guard var compressData = imageData else {
            throw CompressError.NoImage
        }

        if compressData.count > maxSize {
            throw CompressError.OverSize(size: compressData.count)
        }
}

func uploadImage(_ imageData: Data?) {
    var compressData : Data? = nil
    do {
        compressData = try self.compressImage(imageData)
    } catch CompressError.NoImage {
        print("Image Not Exist")
    } catch CompressError.OverSize(let size) {
        print("Image over size of \(size)")
    }  catch _ {}

    //简洁的方式,忽略处理警告
    let compressData = try? self.compressImage(imageData)
}

利用Swift强大的枚举类型,可以定制化警告从而传递出我们需要的信息,使得整个流程更为顺畅。

语法还支持 try?忽略警告获取一个可能为空值的变量,如果自信绝对不会抛出异常的话,还能使用try!获取一个肯定值。

Mac OS 开发

实际编写Cocoa代码过程中,发现与UIKit相差还是比较多的。

控件逻辑

UIKit 的层级一般是 UINavigationController -> UIViewController

Cocoa 的层级则不太一样,NSWindowController -> NSViewController

原因也很简单,手机上一般只有一个窗口,依靠导航栏进行页面跳转。但是桌面端逻辑就不太一样,新页面一般都是以新窗口的形式弹出。

其次桌面端拥有特定的状态栏控件NSMenu,在其中操作菜单项也是一个新的挑战。

腾讯云相关

由于腾讯云只提供了iOS的库,所以我还需要先把库文件重新调整为Cocoa代码。

这一部分也是吃了不少苦头,需要把设备相关的代码与应用、进出后台的通知等都去除,还要处理类似功能的转换(比如UIImage -> NSImage)。

同时还有第二个坑,腾讯云的库都是ObjC代码,所以需要混编。

创建一个工作空间后拖入两个工程,在主工程的 Targets / Build Phases / Embed Frameworks 中加入SDK库。

接着在Swift工程中创建Project-Bridging-Header.h 头文件,在其中引用SDK库。

最后在 Targets / Build Settings / Objective-C Bridging Header 设置头文件,就可以解决代码混编的问题。

其原理在于自动创建了基于头文件的pch,把头文件中引用到的ObjC代码,都桥接到工程中。

图片压缩算法

之所以不使用现成的软件还有一个原因,就是我想自己控制压缩图片的参数和效果。

通过调研和实验图片压缩效果,最终我选择压制成jpg格式,500k大小限制,压缩率限制为最小0.75,等比宽度限制为1280px

文首那张美女图,初始是1.9M 5087x3661,由于尺寸过大,第一次压缩图片质量后,容量反而增加到了2.4M

将宽高等比缩小到1280x922,图片又变大了,这次增加到了4.7M。(改变宽高需要新建一张画布,创建时必须要有alpha通道等其他设置,所以会变大)

我们接着压缩,最终在压缩率为0.9的情况下把图片压到了260K,成功达到了目标。


总结

距离上一次博客已经有两个月的间隔,其中一部分原因在于生活上的一些变故,另一个原因就在于不熟悉 Cocoa + Swift 开发。

好在最终还是啃出来了,Github项目已开源,欢迎大家指点与吐槽。

这次项目最大的收获在于脱离自己的舒适区。人的本性包含惰性,总是趋向于在熟悉的领域干熟悉的活。但是就和企业一样,不创新就死,技术不断在发展,如果没有跟上潮流,最终就会被淘汰。以此共勉!


参考资料

Swift 4.0 教程

App图片压缩裁剪原理和上传方案

原文地址:https://www.cnblogs.com/vanch/p/10083130.html

时间: 2024-08-30 06:07:38

腾讯云Mac图床插件的相关文章

利用码云OpenApi搭建图床

因为自建博客需要图片服务器,考虑到用本机的图片服务器需要考虑数据备份链接路径等一系列问题,还是推荐使用第三方的服务 当前各个主要平台的oss服务,有免费的有收费的,这里就不多说,毕竟个人的理解不一样 本文只讨论使用码云搭建第三方图床的问题,好了,开始使用码云搭建图床的具体操作 在码云上建一个空的远程仓库,然后建一个空的文件夹 这里有几点建议 不要轻易修改仓库的名字和文件夹的名字 注意命名规范简洁,有点强迫症不好意思,丑的链接接受不了 最终的路径像这样,当然你要图片链接更加简洁使用根目录当我没说

零成本建立基于OneDrive空间的图床,私人云

零成本建立基于OneDrive空间的图床 在写博客时,学生党都会面临一个问题,就是图片的外链如何生成,又加上现在的七牛云是30天自动换临时域名,腾讯云的新用户也出了限制,自己也没有服务器和域名,那么我们该如何将OneDrive的空间利用起来呢,当然,有服务器且有域名的可以无视我这篇博文,本篇博文的所有图片都是基于OneDrive的图片外链. 准备一个OneDrive的账号 首先准备一个OneDrive账号,虽然个人注册的OneDrive的空间内存比较小,个人注册的OneDrive账号一般都有5G

.NET CORE上传文件到码云仓库【搭建自己的图床】

.NET CORE上传文件到码云仓库[搭建自己的图床] 先建一个公共仓库(随意提交一个README文件或者.gitignore文件保证master分支的存在),然后到gitee的个人设置页面找到[私人令牌]菜单创建一个access_token.Gitee官方还友好的提供了基于swagger的API文档和调试页面: https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath 搭建步骤 1.新建一个名为imagebed的仓库

使用阿里云OSS+PicGo搭建Markdown图床

步骤: 购买阿里云OSS,40G的大概9元/年 创建OSS专用用户,专门用于访问OSS,注意保存AccessKey和AccessKeySecret 下载阿里官方的OSS Browser管理客户端,并配置连接信息 创建Bucket,注意权限设置为公共读 在GitHub下载PicGo客户端并安装配置 1.购买阿里云OSS 价格: 40G 9元/年 100G 99元/年 500G 486元/年 1T 999元/年 到阿里云官网找OSS入口即可: 2.创建专用用户(可选) 进入控制台后,鼠标悬浮在右上角

WordPress安装WPCOS插件分离图片至腾讯云对象存储加速网站

我们在前面的文章中已经通过"WordPress配置腾讯云对象存储COS之存储桶创建和设置"和"腾讯云对象存储COS绑定域名/开启CDN/设置免费SSL证书"两篇文章完成对于腾讯云对象存储COS的梳理,我们已经会在腾讯云COS中创建存储桶,以及绑定自己的域名和开启CDN加速.如果我们不绑定域名也是可以用的,只不过理论上用自己的域名连接比较专业一些. 同时我们在上一篇文章中也有知道获取腾讯云API密钥,因为在这篇文章中我们会在WordPress课堂网站安装WPCOS插件

宝塔安装Lsky Pro图床教程

欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz Lsky Pro图床是一个支持本地.阿里云 OSS.腾讯云 COS.七牛云.又拍云等储存方式的基于PHP的开源图床. 项目主页:https://www.lsky.pro 项目仓库地址:https://github.com/wisp-x/lsky-pro Lsky Pro 使用手册:https://www.kancloud.cn/wispx/lsky-pro/880042 主要特性 支持第三方云储存,支持本地.阿里云OSS.

盘点国内都有哪些免费好用的图床工具

1. 七牛云 简介:七牛云是国内企业级云服务商,注册认证后有10G永久免费空间,每月10G国内和10G国外流量,速度相当快,七牛云是国内专业CDN服务商,插件支持比较多,有免费ssl证书,但https流量收费.同时可以自定义域名,系统会默认分配测试域名,测试域名只能用20天. 优势:每个月免费10G,图片暂无限制,提供开放接口,开发者可以对接到自己的系统. 缺点:想用https的需要单独付费. 网址:https://www.qiniu.com/ 2.又拍云 简介:注册认证后有10G永久免费空间,

利用腾讯云免费证书打造全https站

什么是https? 超文本传输安全协议(Hypertext Transfer Protocol Secure,缩写为HTTPS)是一种网络安全传输协议http是HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密.HTTPS通过TLS层和证书机制提供了内容加密.身份认证和数据完整性三大功能,

利用腾讯云COS云对象存储定时远程备份网站

版权声明:本文由张戈 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/942851001487125915 来源:腾云阁 https://www.qcloud.com/community 一.优点分析 内网传输:和阿里云OSS一样,腾讯云COS同样支持内网和外网文件传输,对于腾讯云服务器,使用内网传输绝对是最快.最稳定的备份方案! 免费方案:看了下腾讯云COS的定价说明,发现对于备份网站来说简直是绝佳搭档,甚至可以说是钻