2013-01-07 25 views
5

Tôi đang cố định lại kích thước hình ảnh bằng cách giữ tỷ lệ cỡ ảnh. Nó chỉ đủ lớn để lấp đầy màn hình mà không có khoảng trống và nếu cần thiết, một số hình ảnh sẽ bị tắt.Tính toán kích thước hình ảnh bằng cách giữ tỷ lệ cỡ ảnh với các độ phân giải màn hình khác nhau

Hình ảnh dưới đây cho thấy kích thước hình ảnh màu vàng dựa trên kích thước màn hình màu đen.

enter image description here

Heres Mã mà tôi đang thực sự sử dụng, là có cách nào tốt hơn để làm điều này?

if(bwidth > bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth > swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 
    } 

} else if(bwidth < bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight > sheight) {   
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } 
} 
  • swidth = màn hình rộng
  • sheight = màn hình chiều cao
  • bwidth = hình ảnh rộng
  • bheight = chiều cao hình ảnh
+0

làm bạn muốn cắt khu vực vô hình hoặc thay đổi tỷ lệ – mKorbel

+0

tôi không biết nếu cắt là cần thiết, vì nó sẽ không hiển thị, nó chỉ nên phù hợp với những màn hình, luôn luôn –

+0

bạn có khá nhiều mã dự phòng ở đó - làm thế nào về việc tính lại nó thành các yếu tố cần thiết để đọc dễ dàng hơn? – GreyBeardedGeek

Trả lời

-2

Vâng cảm ơn bạn @Erick Robertson Đã thay đổi một bit litte, nhưng bây giờ nó hoạt động!

Đây là mã thay đổi:

if (bwidth/swidth < bheight/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 
+0

Tại sao bạn đăng câu trả lời cho câu hỏi của riêng bạn và sau đó chấp nhận câu trả lời đó thay vì câu trả lời có thông tin cho phép bạn giải quyết vấn đề của mình? Điều này có vẻ rất bất thường. – scottb

9

Hãy so sánh tỷ lệ.

Nếu tỷ lệ chiều rộng đến chiều cao của hình ảnh lớn hơn tỷ lệ chiều rộng và chiều cao của màn hình thì bạn biết bạn sẽ sử dụng chiều rộng màn hình và tính chiều cao. Nếu không, bạn sẽ sử dụng chiều cao màn hình và tính chiều rộng. Chỉ cần đảm bảo không có độ cao nào bằng không!

Lưu ý rằng mã ở đây sẽ thay đổi kích thước hình ảnh để nó luôn lấp đầy màn hình. Điều này có hiệu quả cắt bỏ bất kỳ phần bổ sung nào của hình ảnh. Để làm cho hình ảnh lớn nhất có thể trong khi hiển thị hoàn toàn, hãy thay đổi < thành một dòng > trong dòng đầu tiên.

if (bwidth/bheight < swidth/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 

Tôi cũng làm thêm một vài cải tiến:

  • Giản các phương trình. Chia một tử số và mẫu số cho cả 100 không làm gì cả.
  • Đơn giản hóa việc tạo kiểu chữ. Tôi không biết loại của mỗi biến, nhưng tất cả chúng đều cần phải tăng gấp đôi.
  • Được sử dụng Math.floor thay vì chỉ là một kiểu chữ để int để đảm bảo nó không tròn lên.
+0

chờ .. tôi đang thử nghiệm mã của bạn, tôi đã thay đổi một chút, hiện đang hoạt động trên hình ảnh màn ảnh rộng :) –

+0

Tôi nghĩ rằng tôi đã hiểu được về phía sau. Mã tôi đã viết là để bạn có thể xem toàn bộ hình ảnh trên màn hình của mình. Có vẻ như bạn muốn lấp đầy màn hình và đảm bảo cuộn chỉ theo một hướng? –

+0

chỉ cần điền, không cuộn .. mã tôi thay đổi để hoạt động cho tôi .. cảm ơn sự giúp đỡ của bạn –

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