Lưu ý: Chức năng này không làm việc với PNG iPhone nén, nén này được tự động thực hiện bởi XCode và thay đổi tiêu đề hình ảnh, xem chi tiết ở đây và làm thế nào để vô hiệu hóa tính năng này: http://discussions.apple.com/thread.jspa?threadID=1751896
phiên bản tương lai PSFramework cũng sẽ giải thích các tiêu đề này, hãy chú ý theo dõi.
Xem chức năng này, cô ấy thực hiện điều đó. Chỉ đọc 30 byte của tệp PNG và trả về kích thước (CGSize). Chức năng này là một phần của một khuôn khổ để xử lý hình ảnh được gọi là PSFramework (http://sourceforge.net/projects/photoshopframew/). Chưa được triển khai cho các định dạng hình ảnh khác, nhà phát triển được hoan nghênh.Dự án là Mã nguồn mở theo Giấy phép GNU.
CGSize PSPNGSizeFromMetaData(NSString* anFileName) {
// File Name from Bundle Path.
NSString *fullFileName = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], anFileName ];
// File Name to C String.
const char* fileName = [fullFileName UTF8String];
/* source file */
FILE * infile;
// Check if can open the file.
if ((infile = fopen(fileName, "rb")) == NULL)
{
NSLog(@"PSFramework Warning >> (PSPNGSizeFromMetaData) can't open the file: %@", anFileName);
return CGSizeZero;
}
////// ////// ////// ////// ////// ////// ////// ////// ////// ////// //////
// Lenght of Buffer.
#define bytesLenght 30
// Bytes Buffer.
unsigned char buffer[bytesLenght];
// Grab Only First Bytes.
fread(buffer, 1, bytesLenght, infile);
// Close File.
fclose(infile);
////// ////// ////// ////// //////
// PNG Signature.
unsigned char png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
// Compare File signature.
if ((int)(memcmp(&buffer[0], &png_signature[0], 8))) {
NSLog(@"PSFramework Warning >> (PSPNGSizeFromMetaData) : The file (%@) don't is one PNG file.", anFileName);
return CGSizeZero;
}
////// ////// ////// ////// ////// ////// ////// ////// ////// //////
// Calc Sizes. Isolate only four bytes of each size (width, height).
int width[4];
int height[4];
for (int d = 16; d < (16 + 4); d++) {
width[ d-16] = buffer[ d ];
height[d-16] = buffer[ d + 4];
}
// Convert bytes to Long (Integer)
long resultWidth = (width[0] << (int)24) | (width[1] << (int)16) | (width[2] << (int)8) | width[3];
long resultHeight = (height[0] << (int)24) | (height[1] << (int)16) | (height[2] << (int)8) | height[3];
// Return Size.
return CGSizeMake(resultWidth, resultHeight);
}
Nguồn
2010-01-05 13:29:47
CGImageSource là API hoàn hảo cho điều này, nhưng khó chịu nó không có sẵn trên iPhone. Có thể bạn sẽ phải tự mình thực hiện nó. Điều đó nói rằng, hãy nhớ rằng UIImage sẽ xóa dữ liệu của nó nếu bạn sử dụng + imageWithContentsOfFile: điều này sẽ loại bỏ các lo ngại về sử dụng bộ nhớ của bạn. –