2011-11-16 35 views
10

Để tất cả các bạn các chuyên gia đồ họa, tôi đã tự hỏi mà một trong hai phương pháp này là tốt hơn cho thay đổi kích thước một UIImage:Phương pháp nào để thay đổi kích cỡ UIImage là tốt hơn và tại sao?

Người đầu tiên tôi đã đi qua là đơn giản và phổ biến và được như sau:

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight)); 
    [image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)]; 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();     
    UIGraphicsEndImageContext(); 
    return result; 
} 

phương pháp thứ hai tôi thấy tại liên kết này http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx và dường như để thực hiện tương tự như trên, nhưng có nhiều phức tạp hơn (tôi không thực sự hiểu những gì đang xảy ra trong nó):

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    CGImageRef imageRef = [image CGImage]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst); 
    CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef); 
    CGImageRef ref = CGBitmapContextCreateImage(bitmap); 
    UIImage *result = [UIImage imageWithCGImage:ref]; 

    CGContextRelease(bitmap); 
    CGImageRelease(ref); 

    return result; 
} 

vì vậy, m câu hỏi là, cách nào tốt hơn và tại sao?

Trả lời

0

Đó là cách tiếp cận cấp cao và cấp thấp.

Điều nào tốt hơn? Phụ thuộc vào mục tiêu của bạn.

Cách tiếp cận cấp cao dễ đọc hơn (đối với tôi), có thể cách tiếp cận cấp thấp nhanh hơn một nano giây (không kiểm tra).

Thật khó để đánh giá các thuật toán ...

+0

Tiếp cận mức thấp = duy trì chất lượng tốt hơn sau khi thay đổi kích thước? @tom –

+0

Tôi đoán phương thức drawInRect của UIImage sẽ sử dụng CGContextDrawImage trong nội bộ ... – Tom

4

Nguyên tắc thứ hai là an toàn.

+1

Tại sao điều này lại được đánh dấu? 1: Becasue tuyên bố là sai? 2: Bởi vì luồng là irellevant -> nó không phải. Nếu bạn muốn có một ứng dụng hiệu suất cao, việc đặt lại kích thước nhiệm vụ thành một chuỗi khác là một cách tiếp cận tốt. – esbenr

1

Đây là câu trả lời khá muộn, nhưng tôi sẽ tiếp tục và thêm nó vào bất kỳ lúc nào.

Tôi thực sự đã tìm thấy một số khác biệt về hành vi giữa hai phương pháp, ngoài uy tín.

Trong ứng dụng ảnh của tôi, tôi có chế độ xem máy ảnh tùy chỉnh sẽ gửi bất kỳ hình ảnh nào được chụp tới trình chỉnh sửa hình ảnh tùy chỉnh. Trong ứng dụng, chế độ xem máy ảnh/trình chỉnh sửa tùy chỉnh là cảnh quan độc quyền. Tuy nhiên, bản thân cửa sổ máy ảnh bản địa nó KHÔNG.

Vì vậy, bất cứ khi nào một bức ảnh được chụp ở chế độ dọc, kết quả cuối cùng bị méo. Những biến dạng này dễ dàng được xử lý bằng cách lật chiều rộng và chiều cao, bất cứ khi nào chiều cao < chiều cao.

Phương pháp đầu tiên của hai phương pháp trên (phương pháp đơn giản) dẫn đến hình ảnh được xoay 90 độ và vẫn bị méo. Thứ hai, tuy nhiên, thay đổi kích cỡ hình ảnh hoàn hảo!

Tôi đoán rằng điều này có liên quan đến hành vi dựa trên ngữ cảnh đồ họa. Phương pháp thứ hai không sử dụng ngữ cảnh này, và nó hoạt động hoàn hảo trong trường hợp của tôi.

0

Có nhiều cách khác nhau mà bạn có thể muốn thay đổi kích thước hình ảnh. Ngay cả khi trường hợp bạn có chiều rộng mới và chiều cao mới, bạn có thể muốn thay đổi kích thước hình ảnh thành kích thước mới và bỏ qua tỷ lệ hoặc để chia tỷ lệ hình ảnh và cắt theo kích thước mới.

Có một dự án có API sạch để thực hiện việc đó: https://github.com/mustangostang/UIImage-Resize. Nó sử dụng cách tiếp cận đầu tiên :-)

Các vấn đề liên quan