![]() |
自信的小狗 · yarn 更新依赖包 yarn ...· 1 年前 · |
![]() |
高兴的硬币 · ClickHouse ...· 1 年前 · |
![]() |
欢乐的领带 · Initialize ...· 1 年前 · |
![]() |
捣蛋的金针菇 · flv文件结构解析 - 掘金· 1 年前 · |
我使用PhotosPicker库来选择图像或视频并将其放入数据中:
@State private var selectedImageData: Data? = nil
我要弄清楚到底选了什么。
我找到的所有答案都是关于如何使用路径从文件中检索meme类型,但我没有使用PhotosPicker获得文件路径。
我在某个地方发现了这个:
extension Data {
private static let mimeTypeSignatures: [UInt8 : String] = [
0xFF : "image/jpeg",
0x89 : "image/png",
0x47 : "image/gif",
0x49 : "image/tiff",
0x4D : "image/tiff",
0x25 : "application/pdf",
0xD0 : "application/vnd",
0x46 : "text/plain",
var mimeType: String {
var c: UInt8 = 0
copyBytes(to: &c, count: 1)
return Data.mimeTypeSignatures[c] ?? "application/octet-stream"
}
它可以工作,但它是不完整的,我还需要mp4,mov和尽可能多的
快速研究谷歌的"mime类型十六进制签名“将给您提供 这 或 这 ,例如.
编辑
代码中的签名数组读取文件的第一个字节数据,以确定其类型。
下面是我所说的示例代码:
extension Data
private static let mimeTypeSignatures: [([UInt8], String)] = [
([0x49, 0x49, 0x2A, 0x00], "image/tiff"),
([0x4D, 0x4D, 0x00, 0x2A], "image/tiff"),
([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], "image/png"),
//...
var mimeType: String
let tenFirstBytes = Array(subdata(in: 0..<10))
return Data.mimeTypeSignatures.filter
{ signature in
tenFirstBytes.starts(with: signature.0)
.first?.1 ?? "application/octet-stream"
}
它将数据的10个第一个字节转换为一个数组,然后检查每个MIME类型是否以MIME类型字节开始。(如果MIME签名长度超过10字节,则需要占用10字节以上)。
您可以重新使用代码 这里 来使用签名。
在复制粘贴逻辑并添加tiff、vnd或text/平原的情况后,您将得到以下逻辑:
enum ImageFormat {
case gif, jpg, png, vnd, tiff, unknown
if let data = someData {
switch data.format() {
case .jpg, .png, .gif:
print ("Formats supported by Swift. Yihaaa")
case .tiff:
print ("Do some fancy decoding")
![]() |
欢乐的领带 · Initialize UIautomation tree from an element whose ClassName is Chrome_RenderWidgetHostHWND. Accessability Insights - Stack Overfl 1 年前 |
![]() |
捣蛋的金针菇 · flv文件结构解析 - 掘金 1 年前 |