2009-07-02 13 views
14

Tôi có một máy ảnh kỹ thuật số pháo và tôi đặt nó để chụp ảnh với chất lượng siêu mịn và nó xuất ra một tệp .jpg có kích thước 3 mega. Nếu tôi tải nó như thế này trong ASP.NET (điều này rất hữu ích để thay đổi nó là độ phân giải dpi hoặc thu nhỏ lại hay whaterver).NET Saving jpeg với cùng chất lượng như nó đã được tải

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName); 
bmpPicture = new Bitmap(imgPicture); 

và sau đó tôi lưu nó lại như thế này:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg); 

nó xuất ra một jpg chỉ có kích thước 700KB hoặc hơn. Có một sự mất chất lượng.

Tôi cũng đã cố gắng tiết kiệm nó như thế này:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams); 

nơi codecJpeg là

ImageCodecInfo codecJpeg = this.getEncoderInfo("image/jpeg"); 


    private ImageCodecInfo getEncoderInfo(string mimeType) 
    { 
     // Get image codecs for all image formats 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 

     // Find the correct image codec 
     for (int i = 0; i < codecs.Length; i++) 
      if (codecs[i].MimeType == mimeType) 
       return codecs[i]; 
     return null; 
    } 

và encparams:

EncoderParameters encparams = new EncoderParameters(1); 
encparams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 97L); 

Bằng cách này, kích thước (và tôi cũng nghi ngờ về chất lượng) được duy trì nhưng tôi đang đầu vào chất lượng bằng tay.

Tôi muốn hỏi:

Có cách nào để lưu hình ảnh với chất lượng tương tự như nó đã được nạp mà không thể xác định rõ giá trị chất lượng?

Cảm ơn bạn trước

Trả lời

5

Vì vậy, có vẻ như bạn biết làm thế nào để thiết lập chất lượng, bạn thực sự chỉ cần biết làm thế nào để lấy chất lượng từ hình ảnh ban đầu?

Tôi nghi ngờ rằng Image.PropertyItems là bạn của bạn, nếu chất lượng có trong siêu dữ liệu để bắt đầu. (Tôi không biết liệu có quy mô chuẩn cho chất lượng trong các bộ mã hóa JPEG hay không.)

EDIT: Tôi vừa kiểm tra và jpeg tôi đã tải xuống không có bất kỳ thẻ nào về chất lượng.

Một tùy chọn có thể là tìm ra tệp lớn sẽ có chất lượng tương tự như thế nào và sau đó lưu lại nhiều lần, thực hiện tìm kiếm nhị phân để tìm ra chất lượng phù hợp nhất. Icky, nhưng nó có thể hoạt động.

Tôi có một nghi ngờ lén rằng có không phải là một cách để chỉ bảo vệ cài đặt chất lượng ban đầu, mặc dù tôi không có cơ sở rất tốt cho sự nghi ngờ rằng ...

+2

Thiết PropertyItems và lưu lại sẽ dẫn đến mất chất lượng, bởi vì hình ảnh sẽ được tái mã hóa. Đọc thêm tại đây: http://stackoverflow.com/questions/1038206/net-c-library-for-lossless-exif-rewriting – arbiter

+0

Có, tôi đánh giá cao rằng nó sẽ được mã hóa lại - nhưng tôi nghĩ nó có ý nghĩa với mã hóa lại ở mức "tổn thất" tương tự như bản gốc, nếu bạn muốn. Bạn vẫn sẽ mất dữ liệu, nhưng có lẽ không phải là một số tiền khổng lồ. Cũng lưu ý rằng tôi đã không nói về * thiết lập * PropertyItems - Tôi đã nói về * lấy * nó để tìm ra chất lượng ban đầu, mặc dù điều đó dường như không có dữ liệu có liên quan. –

+0

Cũng tồn tại phần tử propertyitem để tìm chất lượng jpeg - PropertyTagJPEGQuality, nhưng nó được ghi là thẻ riêng cho adobe photoshop, vì vậy tôi không biết nó có được lấp đầy bằng camera hay không. Dù sao có một chút ý nghĩa của việc lưu trữ jpeg với cùng một giá trị chất lượng jpeg, bởi vì mất chất lượng sẽ ở đó. – arbiter

0

Đọc ở đây làm thế nào để tiết kiệm hình ảnh mà không cần mã hóa lại hình ảnh: How-to: Re-encode a JPEG Image with Metadata. Tuy nhiên, nếu bạn cắt xén hoặc thao tác hình ảnh khác thì không thể thực hiện mà không bị mất chất lượng (về mặt kỹ thuật, bạn có thể thực hiện cắt giảm ít hơn, nếu bạn làm việc với ranh giới nhân 16, nhưng AFAIK thì không thể thực hiện được). được thực hiện với các thư viện có sẵn trong .net).

0

Bạn phải sử dụng các thông số bổ sung cho biết GDI + để phát hiện bảng màu.

Ví dụ:

using (var img = Image.FromStream(fileupload.InputStream, true,true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
} 

using (var img = Image.FromFile("yourimage", true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
}