Việc cải thiện wl.'s answer, đây là một cách nhiều hơn nữa mở rộng và chính xác để dự đoán kiểu MIME của hình ảnh dựa trên chữ ký. Mã này phần lớn được lấy cảm hứng từ số ext/standard/image.c của php.
- (NSString *)mimeTypeByGuessingFromData:(NSData *)data {
char bytes[12] = {0};
[data getBytes:&bytes length:12];
const char bmp[2] = {'B', 'M'};
const char gif[3] = {'G', 'I', 'F'};
const char swf[3] = {'F', 'W', 'S'};
const char swc[3] = {'C', 'W', 'S'};
const char jpg[3] = {0xff, 0xd8, 0xff};
const char psd[4] = {'8', 'B', 'P', 'S'};
const char iff[4] = {'F', 'O', 'R', 'M'};
const char webp[4] = {'R', 'I', 'F', 'F'};
const char ico[4] = {0x00, 0x00, 0x01, 0x00};
const char tif_ii[4] = {'I','I', 0x2A, 0x00};
const char tif_mm[4] = {'M','M', 0x00, 0x2A};
const char png[8] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a};
const char jp2[12] = {0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a};
if (!memcmp(bytes, bmp, 2)) {
return @"image/x-ms-bmp";
} else if (!memcmp(bytes, gif, 3)) {
return @"image/gif";
} else if (!memcmp(bytes, jpg, 3)) {
return @"image/jpeg";
} else if (!memcmp(bytes, psd, 4)) {
return @"image/psd";
} else if (!memcmp(bytes, iff, 4)) {
return @"image/iff";
} else if (!memcmp(bytes, webp, 4)) {
return @"image/webp";
} else if (!memcmp(bytes, ico, 4)) {
return @"image/vnd.microsoft.icon";
} else if (!memcmp(bytes, tif_ii, 4) || !memcmp(bytes, tif_mm, 4)) {
return @"image/tiff";
} else if (!memcmp(bytes, png, 8)) {
return @"image/png";
} else if (!memcmp(bytes, jp2, 12)) {
return @"image/jp2";
}
return @"application/octet-stream"; // default type
}
Các phương pháp trên nhận các loại hình ảnh sau đây:
image/x-ms-bmp
(bmp)
image/gif
(gif)
image/jpeg
(jpg, jpeg)
image/psd
(psd)
image/iff
(iff)
image/webp
(webp)
image/vnd.microsoft.icon
(ico)
image/tiff
(tif, tiff)
image/png
(png)
image/jp2
(jp2)
Thật không may, không có cách nào đơn giản để có được loại thông tin này từ một cá thể UIImage
, vì dữ liệu bitmap được đóng gói của nó không thể truy cập được.
Tại sao bạn cần biết? Nếu UIImage hiển thị tốt, tôi không thấy lý do tại sao bạn không thể duy trì nó mà không có phần mở rộng. – kennytm
Hình ảnh cũng sẽ được hiển thị trên trang web trong tương lai. Tôi thấy, bây giờ, các trình duyệt có thể hiển thị hình ảnh thô (không có phần mở rộng tệp) một cách chính xác. – pschang