2010-01-19 47 views
15

Tôi muốn đổi kích thước hình ảnh thành kích thước tệp cụ thể. Ví dụ: không quá 200KB. Cách tiếp cận tốt nhất để đạt được điều này với C# .NET là gì?Làm cách nào để thay đổi kích thước ảnh thành một kích thước tệp cụ thể?

Cảm ơn!

+0

Định dạng nào? PNG? JPEG? –

+1

Xác định "tốt nhất": Nhanh nhất, chất lượng hình ảnh tốt nhất, sử dụng tối thiểu bộ nhớ, sử dụng tối thiểu CPU? – RedFilter

+0

Định dạng JPEG (điều này có thực sự khác với các định dạng khác không?). "Tốt nhất" -> 1. chất lượng hình ảnh tốt nhất 2. nhanh nhất –

Trả lời

3

Nếu bạn nghĩ về điều đó, bạn sẽ không biết kích thước của hình ảnh cho đến khi sau khi được thay đổi kích thước. Vì vậy, bạn đã hoặc phải thực hiện lặp đi lặp lại các lần thử và so sánh kích thước tệp sau đó hoặc bạn có thể thay đổi các ràng buộc của mình để hạn chế hình ảnh thành một tập hợp chiều cao và chiều rộng cụ thể.

+1

Sau khi kiểm tra một số phương pháp có kết quả không đạt yêu cầu, tôi quyết định hạn chế chiều rộng và chiều cao :) –

1

Bạn có thể làm rất nhiều việc với lớp học Drawing.Image để đổi kích thước hình ảnh.

Có nhiều câu hỏi về cách thực hiện điều đó. Đây là one.

Về kích thước - bạn sẽ không biết kích thước là gì cho đến sau hoạt động thay đổi kích thước. Cách duy nhất để chắc chắn là thay đổi kích thước, kiểm tra kết quả và nếu nó quá lớn, hãy thử thay đổi kích thước với chất lượng thấp hơn. Lặp lại cho đến khi hoàn thành.

Bạn có thể ước tính kích thước nếu bạn biết kích thước và độ sâu màu, như được mô tả trong câu trả lời cho câu hỏi this (giống hệt nhau).

+0

Nghe có vẻ như một cách ngu ngốc để làm điều đó, từ quan điểm của CompSci. – MSalters

+0

@MSalters Làm thế nào bạn sẽ đi về dự đoán tương lai, trong một cách CompSci, đó là? – Oded

+0

Để bắt đầu, đây là một algoritm xấp xỉ liên tiếp một chiều (không có kiểm tra cho sản lượng quá nhỏ/chất lượng xấu).Vì vậy nó hoặc là chậm hoặc bị vượt qua. Vấn đề thứ hai là nếu bạn không đạt được mục tiêu trong lần thử đầu tiên, bạn sẽ phải làm lại mọi thứ. – MSalters

1

Nếu đây không phải là một chức năng, dùng thử rất quan trọng và không bị lỗi hoạt động tốt đủ. Chỉ cần giả sử rằng nếu bạn cần thu hẹp đầu vào thành N * 100%, bạn làm như vậy bằng cách chia tỷ lệ cả hai thứ nguyên theo sqrt(N) * 100%.

Nếu nó quan trọng, bạn cần hiểu công nghệ nén hình ảnh tốt hơn. Tôi sẽ giả định JPG. Đó là một định dạng hình ảnh mà đạt được nén lossy bằng cách phá vỡ hình ảnh xuống thành khối 8x8 pixel, DFT chuyển đổi chúng, ném đi các hệ số nhỏ, và sau đó nén bitstream kết quả.

Bây giờ nó theo sau bạn có thể fiddle khá một chút với mức chất lượng, có bao nhiêu hệ số nhỏ bạn vứt đi. Bạn không cần phải làm lại DFT (đắt tiền) cho việc này. Vì vậy, nếu tập tin kết thúc chỉ hơi quá lớn, bạn có thể vứt bỏ thêm một vài hệ số và giải nén. Và nếu bạn hơi tích cực, sau đó đặt lại một vài coeffecients và nén lại. Đây là tất cả khá nhanh.

-1

Một ước tính sơ bộ như sau:

size(KB) = (width * height * bitdepth)/(8 * 1024)

Kích thước tập tin được thổi phồng lên một chút do hơn để nộp thông tin (thông tin nén, vv).

+0

-1 Loại tệp nào áp dụng cho điều này? Làm thế nào bạn đến với công thức này? –

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