2011-02-22 33 views
5

Tôi hiện đang sử dụng blobstore để tạo hình thu nhỏ cho hình ảnh, tuy nhiên, tôi muốn lưu trữ kích thước của hình thu nhỏ trong thẻ img đó là thực hành tốt và giúp tăng tốc độ hiển thị và làm cho trang được tải một phần trông đẹp hơn một chút.App Engine: Tính toán kích thước của hình thu nhỏ được tạo bằng cách phân phối hình thu nhỏ từ blobstore

Tôi làm cách nào để tính kích thước của hình thu nhỏ được tạo bởi blobstore, chỉ biết kích thước của hình ảnh gốc?

Lần thử trước đó của tôi không chính xác lắm, phần lớn thời gian bị tắt bởi một hoặc hai pixel (có thể do làm tròn).

Tôi hiểu rằng tìm nạp hình thu nhỏ và sử dụng API hình ảnh để kiểm tra kích thước sẽ hoạt động, nhưng tôi nghĩ điều đó không hiệu quả.

Đây là mã tôi sử dụng để tính toán vào lúc này, tuy nhiên, thỉnh thoảng nó được tắt bởi một pixel, khiến trình duyệt hơi căng hình ảnh, làm thay đổi kích thước đồ tạo tác cũng như ít hiệu suất hơn.

from __future__ import division 
def resized_size(original_width, original_height, width, height): 
    original_ratio = float(original_width)/float(original_height) 
    resize_ratio = float(width)/float(height) 
    if original_ratio >= resize_ratio: 
     return int(width), int(round(float(width)/float(original_ratio))) 
    else: 
     return int(round(float(original_ratio) * float(height))), int(height) 

Độ chính xác là rất quan trọng!

+1

Câu hỏi hay!Bạn đã thử công thức nào và trong trường hợp nào là sai? –

+0

@systempuntoout, tôi không tạo chúng, API phân phát hình ảnh của Google và API không cung cấp thứ nguyên. @ Nick Johnson, tôi đã cập nhật câu hỏi của mình với mã tôi đang sử dụng hiện tại. –

Trả lời

4

Tôi thấy sự cố. Lý do là R của C đang được sử dụng để tính toán các kích thước . Python không có một rint thực hiện tương đương như nó đã được đưa ra khỏi bởi Rossum trong 1.6:

http://markmail.org/message/4di24iqm7zhc4rwc

của bạn chỉ trông cậy ngay bây giờ là thực hiện rint của riêng bạn trong python.

rint theo mặc định sẽ thực hiện "vòng tới thậm chí" so với vòng pythons có chức năng khác. Đây là một thực hiện đơn giản (không có cạnh trường hợp xử lý cho -INF inf +, vv)

import math 

def rint(x): 
    x_int = int(x) 
    x_rem = x - x_int # this is problematic 
    if (x_int % 2) == 1: 
    return round(x) 
    else: 
    if x_rem <= 0.5: 
     return math.floor(x) 
    else: 
     return math.ceil(x) 

Đoạn mã trên là cách nó nên được thực hiện về mặt lý thuyết. Vấn đề nằm ở x_rem. x - x_int sẽ nhận được componenet phân đoạn, nhưng thay vào đó bạn có thể lấy được phần thập phân + . Vì vậy, bạn có thể cố gắng thêm thresholding nếu bạn muốn

import math 

def rint(x): 
    x_int = int(x) 
    x_rem = x - x_int 
    if (x_int % 2) == 1: 
    return round(x) 
    else: 
    if x_rem - 0.5 < 0.001: 
     return math.floor(x) 
    else: 
     return math.ceil(x) 

Tại đây. Tôi đã khó mã hóa ngưỡng 0,001. Bản thân bản thân nó là vấn đề. Tôi đoán bạn thực sự cần phải chơi xung quanh với việc thực hiện rint và phù hợp với nó để ứng dụng của bạn và xem những gì hoạt động tốt nhất. Chúc may mắn!

+0

Tôi không quen với rint, làm cách nào để triển khai nó bằng Python? –

0

Giả sử bạn có hình ảnh ban đầu là 1600x1200 và bạn muốn có hình thu nhỏ 800, kết quả mong đợi là hình ảnh 800x600. Để tính toán điều này, bạn có thể thực hiện các thao tác sau:

// In Java 
double aspectRatio = originalWidth/originalHeight; 
output_width = 800; 
output_height = (int)Math.round(800.0/aspectRatio); 

Hãy xem điều này có hoạt động với các trường hợp thoái hóa hay không. Giả sử rằng bạn có một hình ảnh gốc của 145x111 và bạn muốn có hình thu nhỏ có kích thước 32.

aspectRatio == 1.3063063063063063 
output_width == 32 
output_height == Math.round(32.0/1.3063063063063063) == 24 

Bạn có thể làm điều gì đó tương tự cho hình ảnh được định hướng dọc.

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