如何解决在Kotlin中解析webp文件头以获取其高度和宽度,但得到了意外的结果
根据扩展文件格式的WebP Container Specification,我正在尝试读取WebP图像标头。
fun get24bit(data: ByteArray,index: Int): Int {
return ((data[0 + index].toInt()) or (data[1 + index].toInt() shl 8) or (data[2 + index].toInt() shl 16))
}
fun get32bit(data: ByteArray,index: Int): Int {
return get24bit(data,index) or (data[3 + index].toInt() shl 24)
}
// data -> File(fileName).readBytes() for testing purpose
fun webpExtract(data: ByteArray) {
println(String(data.copyOfRange(0,4)))
println("Size: ${get32bit(data,4)}")
println(String(data.copyOfRange(8,12)))
println(String(data.copyOfRange(12,16)))
// 16,17,18,19 reserved
val width = 1 + get24bit(data,20)
val height = 1 + get24bit(data,23)
println("Width: $width,Height: $height")
}
输出为:
RIFF
Size: -52
WEBP
VP8X
Width: 17,Height: 32513
“字符串”输出没问题,但是“大小”为负数,“宽度”和“高度”错误,即它们应该分别为128和128(对于我使用的测试图像)。
代码中有什么问题吗?我无法找出问题所在。
我还验证了实际的C ++实现here in github。我的代码执行相同的移位,但是结果不正确。据我所知,左移与无符号和有符号右有什么关系?
解决方法
不知道Spec不完整还是什么,我记录了字节值并以某种方式找到了模式。并发现维度分别在24-26和27-29索引处。
val width = 1 + (get24bit(data,24))
val height = 1 + (get24bit(data,27))
这可以解决问题!希望注意这一点是有益的,只要不更新文档即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。