我使用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和尽可能多的
发布于 2022-10-16 05:48:56
快速研究谷歌的"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字节以上)。
发布于 2022-10-16 09:50:31
您可以重新使用代码这里来使用签名。
在复制粘贴逻辑并添加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")
case .pdf:
print ("Read as a file")
case .unknown:
print ("Treat this data differently")
}
}
如果使用String
进行比较,请确保使用. isoLatin1
进行解码。如果使用mimeTypeSignatures
中的键对字节进行比较,则不需要这样做。我个人认为使用String更容易读懂。它有助于解码和添加测试。
https://stackoverflow.com/questions/74083113
复制相似问题