2009-03-26 58 views
8

Tôi có hình ảnh rất lớn (jpg) và tôi muốn viết chương trình csharp để lặp qua các tệp và giảm kích thước của từng hình ảnh xuống 75%.Tạo hình thu nhỏ và giảm kích thước hình ảnh

Tôi cố gắng này:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

nhưng kích thước tập tin vẫn còn rất lớn.

Có cách nào để tạo hình thu nhỏ và có kích thước tệp nhỏ hơn nhiều không?

+0

Những gì kích thước là bạn đi qua trong tức là các giá trị của chiều rộng và chiều cao là gì? – dirkgently

+0

Tôi đang tạo các tệp có kích thước 800 x 600 – leora

Trả lời

18
private void CompressAndSaveImage(Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

private static ImageCodecInfo GetCodecInfo(string mimeType) { 
    foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders()) 
     if (encoder.MimeType == mimeType) 
      return encoder; 
    throw new ArgumentOutOfRangeException(
     string.Format("'{0}' not supported", mimeType)); 
} 

Cách sử dụng:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10); 

Điều đó sẽ nén Test.jpg với một chất lượng 10 và lưu nó như Test2.jpg.

EDIT: Có thể tốt hơn như một phương pháp khuyến nông:

private static void SaveCompressed(this Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

Cách sử dụng:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
myImg.SaveCompressed(@"C:\Test2.jpg", 10); 
+0

bạn có thể có chức năng này trả về loại Hình ảnh khi tôi cần giữ một giao diện nhất định – leora

+0

Nén diễn ra khi tệp được lưu. Bạn vẫn có thể sử dụng mã GetThumbnailImage của mình, nhưng thay vì gọi Image.Save, bạn nên gọi Image.SaveCompressed. AKAIK, bạn không thể nén trực tiếp đối tượng Hình ảnh và sau đó trả lại nó. –

+0

Bạn không cần phải lưu trong một tệp, vì bạn có thể lưu nó trong luồng bộ nhớ và tạo lại bitmap từ luồng bộ nhớ, loại bỏ luồng sau đó. Bằng cách này, bạn có thể trả về 'Hình ảnh' trong khi giảm kích thước. –

0

Nén hình ảnh của bạn. Đối với hình thu nhỏ, JPEG là đủ, vì bạn không tìm kiếm chất lượng.

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

thumbNail.Save(fileName, ImageFormat.Jpeg); 
0

Từ GetThumbnailImage 's tài liệu:

Nếu Image bao gồm một nhúng hình thu nhỏ, phương pháp này truy xuất hình thu nhỏ được nhúng và chia tỷ lệ hình ảnh thành kích thước được yêu cầu. Nếu Hình ảnh không chứa hình thu nhỏ được nhúng, phương pháp này sẽ tạo hình thu nhỏ bằng cách chia tỷ lệ hình ảnh chính.

Tôi khuyên bạn nên sử dụng các giá trị chiều rộng và chiều cao nhỏ hơn. Hãy thử:

// reduce the size of each image by 75% from original 800x600 
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero); 

Xem sample mã.

Cũng đọc tài liệu:

Phương pháp GetThumbnailImage hoạt động tốt khi hình ảnh thu nhỏ được yêu cầu có kích thước khoảng 120 x 120 pixel. Nếu bạn yêu cầu một hình thu nhỏ lớn (ví dụ: 300 x 300) từ Hình ảnh có hình thu nhỏ được nhúng, có thể có sự mất chất lượng đáng chú ý trong hình thu nhỏ. Nó có thể là tốt hơn để mở rộng hình ảnh chính (thay vì mở rộng hình thu nhỏ được nhúng) bằng cách gọi phương thức DrawImage.

Tôi nghĩ bạn có thể muốn xem xét API mở rộng.

2

ImageMagick là công cụ dòng lệnh cực kỳ mạnh mẽ để thực hiện thao tác hình ảnh. Tôi đã sử dụng nó để thay đổi kích thước hình ảnh lớn và tạo hình thu nhỏ trong trường hợp tỷ lệ co của hình ảnh nguồn không xác định hoặc không đáng tin cậy. ImageMagick có thể thay đổi kích thước hình ảnh thành chiều cao hoặc chiều rộng cụ thể đồng thời duy trì tỷ lệ khung hình gốc của ảnh. Nó cũng có thể thêm không gian xung quanh một hình ảnh nếu cần thiết. Tất cả trong tất cả đều rất mạnh mẽ và trừu tượng tốt đẹp từ việc phải đối phó với .nets API hình ảnh.Để sử dụng công cụ ImageMagick dòng lệnh từ bên trong C# Tôi khuyên bạn nên sử dụng các đối tượng System.Diagnostics.ProcessStartInfo như vậy:

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe"; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation); 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.WaitForExit(); 

Sử dụng quy mô% paramater bạn có thể dễ dàng giảm kích thước của hình ảnh của bạn bằng cách 75%

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