Tips:
阿里云oss的图片处理功能非常强大,除了常规的放缩,压缩,改变格式外,还提供了下列实用功能:
1 . 自定义图片样式功能:可以使用一个很短的图片处理参数实现复杂的图片处理操作。定义好后绑在bucket上,这样可更方便的进行规约,使各端进行的取图片操作是完全相同的,详情参考阿里云官方文档:
2. 图片处理持久化:阿里云默认不保留处理结果,这种功能适合于简单不耗时/临时性的图片处理。而使用阿里云SDK:ImgSaveAs 功能可以将处理结果保存到相应的oss存储空间中,适合生成系统性的图片访问场景,减少了每次图片处理的过程中耗时。
3. 原图保护功能:开启后,用户通过常规的手段,无法访问到无水印的高清原图,也无法直接通过类似 ?x-oss-process=image/action,parame_value 这种操作拿到处理后的图片。
只能:要么通过加签名形式拿到原图,要么通过已经定义好的样式,拿缩略图或带水印的图。有效的增加了爬取原始图片的难度。
以下方式可以访问开启原图保护的图片:
- 携带样式参数的请求
- URL参数方式,例如
http://bucket.<endpoint>/object?x-oss-process=style/<StyleName>。 - 分隔符方式,例如
http://bucket.<endpoint>/object<分隔符><StyleName>。
- URL参数方式,例如
- 携带签名的请求,例如
http://bucket.<endpoint>/object?OSSAccessKeyId=nz2pc56s9****9l&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2By****YEAiv4%3D。
Review:
关于Camera的自动对焦的功能(由于目前项目中应用的Camera,后续再总结Camera2的):
Camera的对焦模式:
-
FOCUS_MODE_AUTO
自动对焦模式,应用需要调用autoFocus开始对焦,只会对焦一次,对焦成功会有回调。 -
FOCUS_MODE_INFINITY
无穷对焦模式,应用很少,不能调用autoFocus方法。 -
FOCUS_MODE_MACRO
特写镜头对焦模式,应用需要调用autoFocus开始对焦 -
FOCUS_MODE_FIXED
固定焦点模式,焦点不可调用时都是在这种模式,如果Camera能够自动对焦,这种模式会固定焦点,通常应用于超焦距对焦。这种模式不能调用autoFocus。 -
FOCUS_MODE_EDOF
扩展景深模式,部分手机不支持该功能,应用较少。 -
FOCUS_MODE_CONTINUOUS_VIDEO
连续自动对焦模式,主要用于录制视频过程中,Camera会不断地尝试聚焦,这是录制视频时对焦模式的最好选择,在设置了Camera的参数后就开始自动对焦,但是调用takePicture时不一定已经对焦完成。parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 这种模式可以实现自动对焦,但据一些信息反映对焦时会连续闪动,有待进一步试验。
触摸对焦:
就是在屏幕上点击某个点,通过setFocusAreas()指定这个对焦区域,应用到相机,相机就以此点内容进行对焦,保证此点最清晰。
可以setFocusAreas函数 ,在api14添加,api14之前只能调用autoFocus函数进行对焦。部分相机的前置摄像头不支持手动对焦。
可以通过:
camera.parameters.maxNumFocusAreas()
进行判断,返回值表示支持的最大对焦区域,只有大于0时表示支持触摸对焦功能。
只在FOCUS_MODE_AUTO,FOCUS_MODE_CONTINUOUS_VIDEO,FOCUS_MODE_CONTINUOUS_PICTURE这三种模式下有效。
Area类用于标识感光区域(测光)和聚焦区域,用于相机计算自动曝光、自动白平衡、自动聚焦。每一个Area是一个矩形区域,有一个weight标识它的重要程度。Camera的可以设置定点对焦的区域会被映射到一个左上角为(-1000,-1000)到右下角(1000,1000)的区域上。在这个范围之外设置无效,如果area的大小为0或者weight为负是不被允许的。
Camera.Area对象,包含两个参数:
Rect对象,它用于指定Camera预览窗口一块矩形区域
一个权重值(weight),它告诉Camera这块指定区域应该给予的测光或调焦计算的重要性等级,权重大的优先级高,权重最高为1000。
直接通过setFocusAreas()应用到相机往往不能达到理想的效果,因为Android本身的问题以及设备的差异,在常用的对焦模式为continuous-picture下,setFocusAreas()可能会不工作。目前常用的解决办法是在setFocusAreas()同时修改相机对焦模式为macro等,待对焦完毕后,再将对焦模式修改为用户之前定义的。
触摸测光:
还有一种增强Camera的方式叫做触摸测光,就是在屏幕上点击某个点,相机调整曝光亮度,保证此点亮度最为合适;
setMeteringAreas设置感光区域,也是利用Area设置测光的区域,使用之前要先调用getMaxNumMeteringAreas如果大于0说明支持测光,否则不支持无法使用。
触摸测光与触摸对焦类似,只是作用稍有不同,触摸对焦用于改变聚焦点,触摸测光用于改变光的强弱,一般两者结合使用。
注意:有时可能因为设置的区域过小或者权重weight过小导致效果不明显可以增大区域和weight。
Algorithm:
966 检查拼写错误:
class Solution {
//先把原音字母定义出来
private fun isVowel(charAt: Char): Boolean {
return Character.toLowerCase(charAt) in mutableListOf('a','e','i','o','u')
}
fun spellchecker(wordlist: Array<String>, queries: Array<String>): Array<String?> {
val equals: MutableSet<String> = HashSet()
val lowerEqual: MutableMap<String, String> = HashMap()
val vowelEqual: MutableMap<String, String> = HashMap()
for (i in wordlist.indices) {
equals.add(wordlist[i])
val lowerCaseWord = wordlist[i].toLowerCase()
if (!lowerEqual.containsKey(lowerCaseWord)){
lowerEqual.put(lowerCaseWord, wordlist[i])
}
val vowelCaseWord = ambiguousVowel(wordlist[i])
if (!vowelEqual.containsKey(vowelCaseWord)){
vowelEqual.put(vowelCaseWord, wordlist[i])
}
}
val results = arrayOfNulls<String>(queries.size)
var index = 0
for (i in queries.indices) {
//相等
if (equals.contains(queries[i])) {
results[index++] = queries[i]
} else if (lowerEqual.containsKey(queries[i].toLowerCase())) {
//大小写相等
results[index++] = lowerEqual[queries[i].toLowerCase()]
} else if (vowelEqual.containsKey(ambiguousVowel(queries[i]))) {
//元音相同
results[index++] = vowelEqual[ambiguousVowel(queries[i])]
} else {
//不匹配
results[index++] = ""
}
}
return results
}
private fun ambiguousVowel(s: String): String {
val stringBuffer = StringBuffer()
for (char in s.toCharArray()) {
if (isVowel(char)) {
stringBuffer.append("a")
} else {
stringBuffer.append(Character.toLowerCase(char))
}
}
return stringBuffer.toString()
}}