在 Kotlin 中解析 webp 文件头以获取其高度和宽度,但得到意外结果

2023-12-07

我正在尝试读取 WebP 图像标题,根据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++ 实现在github上。我的代码执行相同的位移,但结果不正确。据我所知,左移与无符号和有符号右移没有任何关系?


不知道Spec不完整或其他什么,我记录了字节值并以某种方式找到了模式。发现维度在24-26和27-29索引处。

val width = 1 + (get24bit(data, 24))
val height = 1 + (get24bit(data, 27))

这招就起作用了!希望只要文档未更新,注意这一点就会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Kotlin 中解析 webp 文件头以获取其高度和宽度,但得到意外结果 的相关文章

随机推荐