2009-11-09 50 views
33

Tôi đang sử dụng mã này để thay đổi kích thước một hình ảnh trên iPhone:Thay đổi kích thước UIImage với tỷ lệ co?

CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); 
UIGraphicsBeginImageContext(screenRect.size); 
[value drawInRect:screenRect blendMode:kCGBlendModePlusDarker alpha:1]; 
UIImage *tmpValue = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

nào đang làm việc rất tốt, miễn là tỉ lệ của hình ảnh phù hợp mà của hình ảnh thay đổi kích cỡ mới. Tôi muốn sửa đổi điều này để nó giữ tỷ lệ khung hình chính xác và chỉ cần đặt một nền đen bất cứ nơi nào hình ảnh không hiển thị. Vì vậy, tôi vẫn sẽ kết thúc với một hình ảnh 320x480 nhưng với màu đen trên đầu và cuối hoặc bên, tùy thuộc vào kích thước hình ảnh ban đầu.

Có cách nào dễ dàng để thực hiện việc này tương tự như những gì tôi đang làm không? Cảm ơn!

+0

Dưới đây là một bài viết mà giữ nguyên tỉ lệ: http://stackoverflow.com/questions/7645454/resize-uiimage-by-keeping-aspect-ratio-and-width –

Trả lời

52

Sau khi bạn đặt rect màn hình của bạn, làm một cái gì đó như sau để quyết định những gì rect để vẽ các hình ảnh trong:

float hfactor = value.bounds.size.width/screenRect.size.width; 
float vfactor = value.bounds.size.height/screenRect.size.height; 

float factor = fmax(hfactor, vfactor); 

// Divide the size by the greater of the vertical or horizontal shrinkage factor 
float newWidth = value.bounds.size.width/factor; 
float newHeight = value.bounds.size.height/factor; 

// Then figure out if you need to offset it to center vertically or horizontally 
float leftOffset = (screenRect.size.width - newWidth)/2; 
float topOffset = (screenRect.size.height - newHeight)/2; 

CGRect newRect = CGRectMake(leftOffset, topOffset, newWidth, newHeight); 

Nếu bạn không muốn để phóng to hình ảnh nhỏ hơn screenRect, hãy chắc chắn factor lớn hơn hoặc bằng một (ví dụ: factor = fmax(factor, 1)).

Để có nền đen, có thể bạn chỉ muốn đặt màu bối cảnh thành màu đen và gọi fillRect trước khi vẽ hình ảnh.

+0

'giá trị' là biến Cory đang sử dụng để lưu trữ hình ảnh nguồn. –

+0

@Frank Schmitt, tôi có thể kiểm tra cách tôi có thể đặt ngữ cảnh thành màu đen cho trường hợp này không? – Zhen

+0

Tôi đã nhận được "Khai báo ngầm định hàm 'max'" được trình biên dịch đưa ra, mặc dù tôi nhớ bao gồm math.h (Tôi đang sử dụng XCode 4.0) Thay đổi: 'float factor = max (…' to 'float factor = MAX (… 'tất cả các mũ) đã giải quyết vấn đề FWIW lý do tôi cần phải rescale một UIImage (như trái ngược với UIImageView) là vì tôi đã thiết lập hình ảnh theo kiểu mặc định UITableCell.Điều này đã giúp tôi tránh cần phải thực hiện một UITableCell tùy chỉnh. _Thanks Frank cho một giải pháp tuyệt vời _ – cleverbit

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