2010-06-23 34 views
5

Tôi có một tệp bmp và đang cố gắng chuyển đổi nó sang định dạng jpeg. Jpeg được tạo bằng cách sử dụng đoạn mã sau sẽ mất rất nhiều sự rõ ràng. Tôi đã thử tinh chỉnh nhiều cài đặt để không có kết quả.Vấn đề chuyển đổi bmp thành jpg bằng cách sử dụng thành phần TJpegImage

Có ai có chức năng chuyển đổi tệp bmp thành tệp jpeg không?

var 
    Bmp: TBitmap; 
    Jpg: TJPEGImage; 
begin 
    Bmp := TBitmap.Create; 
    Jpg := TJPEGImage.Create; 
    try 
    Bmp.LoadFromFile(BmpFileName); 
    Jpg.Assign(Bmp); 
    jpg.PixelFormat :=jf24bit; // or jf8bit 
    Jpg.CompressionQuality := 100; 
    Jpg.ProgressiveDisplay := False; 
    Jpg.ProgressiveEncoding := False; 

    Jpg.SaveToFile(JpgFileName); 
    finally 
    Jpg.Free; 
    Bmp.Free; 
    end; 
end; 

Cập nhật II Rất nhiều người đã phản ứng jpeg mà không phải là loại đồ họa để sử dụng trong trường hợp này. Hiểu. Không phải để đánh bại một con ngựa chết, nhưng tôi đã có thể sử dụng các chương trình khác (ví dụ: Photoshop) và chuyển đổi nó thành một jpeg đẹp. Và công cụ tôi đang sử dụng để tạo biểu đồ (fusioncharts) có thể xuất nó sang một jpeg trông rất đẹp (xem bên dưới). Sự khác biệt là gì?

+0

Tôi không biết đây có phải là vấn đề không. Bạn có thể muốn thiết lập cho bạn cài đặt chất lượng TRƯỚC KHI bạn gán BMP cho Jpg. Việc chuyển đổi có thể xảy ra tại phân công và không lưu vào tệp. –

+0

@gbrandt: Không, tuyên bố là hoàn toàn ổn khi nó ở đâu. –

+1

Tôi đã làm một số theo dõi về điều này. Từ những gì tôi có thể thu thập nó dường như mất đi sự rõ ràng trong cuộc gọi savetofile. Trong dự án của tôi, tôi đã thêm một TImage và gán jpeg cho nó. Nó làm cho tốt. –

Trả lời

1

Như những người khác đã nói, JPEG chỉ đơn giản là không đúng định dạng cho rằng loại hình ảnh - và với các cạnh sắc có tần số cao, bạn có thể là một trong những trường hợp xấu nhất hình ảnh cho JPEG!

Tôi khuyên bạn nên có một bản sao Paint.Net và thử lưu/xem trước hình ảnh ở các định dạng khác nhau (PNG, JPEG, GIF, BMP, v.v.) và cảm nhận sự cân bằng giữa kích thước hình ảnh, chất lượng và hiệu suất .

Tôi đã thử lưu hình ảnh thử nghiệm của bạn với Paint.net dưới dạng JPEG và nhận được chính xác chất lượng như Delphi cung cấp cho bạn, do đó, không có gì sai với những gì bạn (hoặc Delphi) đang làm ...

UPDATE: According to Wikipedia...

Có một tùy chọn chế độ lossless quy định tại tiêu chuẩn JPEG; tuy nhiên, chế độ đó không được hỗ trợ rộng rãi trong các sản phẩm .

Tôi đoán FusionCharts và Photoshop có cách chỉ định chế độ này. Nó thường không được sử dụng, vì JPEG thường được coi là đồng nghĩa với nén LOSSY.

Tóm lại, trong khi các tệp JPEG có thể hỗ trợ nén không bị mất, JPEG không phải là định dạng lý tưởng vì nó không được hỗ trợ rộng rãi. Nếu bạn muốn mất mát, PNG vẫn là một lựa chọn tốt hơn. Phiên bản nén PNG của hình ảnh của bạn nhỏ hơn 30% so với hình ảnh JPEG không nén (71K so với 101K)

+0

Cảm ơn bạn đã phản hồi chi tiết. Vì vậy, câu trả lời hình ảnh "Lớn" là không sử dụng jpeg.Nhưng những gì tôi không thể hiểu là làm thế nào một số chương trình có thể lưu nó ở định dạng jpeg và vẫn có nó trông đẹp. Tôi đã thêm một tệp jpeg mới ở trên. Làm thế nào là jpeg này có thể render độc đáo? –

4

Nếu bạn muốn giảm chất lượng càng ít càng tốt, thì bạn nên nén càng ít càng tốt, tức là đặt CompressionQuality := 100.

Cập nhật

Định dạng hình ảnh JPG được được thiết kế để được sử dụng với ảnh và hình ảnh raster tương tự. JPG sử dụng nén phá hủy để giảm kích thước tệp. Tuy nhiên, hiệu ứng hình ảnh của nén này là không đáng kể đối với các giá trị chất lượng lớn (> ~ 80) vì ảnh không chứa các khu vực lớn có cùng màu, hình dạng rất thường xuyên, v.v.

Định dạng JPG nên sử dụng cho bất kỳ thứ gì ngoài ảnh chụp. Ví dụ, sơ đồ, ảnh chụp màn hình, vv, có chứa các khu vực rộng lớn của cùng một màu sắc chính xác, hình dạng rất thường xuyên, vv, sẽ hiển thị các đồ tạo tác rõ ràng khi JPG nén. Đối với loại hình ảnh raster này, hãy sử dụng PNG. PNG cũng là một định dạng nén (một định dạng rất, rất tốt!), Nhưng nén không phá hủy.

Vì vậy, vui lòng không sử dụng JPG cho biểu đồ của bạn! Sử dụng PNG!

+0

Thay đổi CompressionQuality không ảnh hưởng đến nó (Tôi đã cập nhật giá trị trong bài đăng gốc). –

+0

Ok Cảm ơn. Câu trả lời "ảnh lớn" có vẻ là jpeg không phải là loại đồ họa có thể áp dụng. NHƯNG, đọc Bản cập nhật II của tôi ở trên. Có vẻ như nó có thể được chuyển đổi thành một jpeg đáng kính. Tại sao điều này? –

1

Như Andreas nói, jack lên CompressionQuality đến 100. Nếu bạn muốn thử một ví dụ khác, tiến sĩ Bob (thường xuyên SO đóng góp) có một writeup tốt đẹp ở đây:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5031886.html#

Ông có mã mà sử dụng cách tiếp cận luồng. Tôi mong đợi kết quả tương tự, nhưng bạn không bao giờ biết. Dưới đây là các mã:
https://web.archive.org/web/1/http://techrepublic%2ecom%2ecom/html/tr/sidebars/5031886-1.html

+0

Đã thử - cùng một kết quả. Bạn có thể được đảm bảo để đạt được kết quả tương tự với một jpeg như với một bmp? –

+0

@MSchenkel - không, jpeg là thuật toán mất dữ liệu và sẽ không cho kết quả giống hệt như BMP. Sử dụng GIF hoặc PNG để có kết quả tốt nhất. Jpeg sẽ đạt yêu cầu cho ảnh, nhưng bạn sẽ thấy các hiện vật "muỗi" với ảnh chụp màn hình, văn bản, bản vẽ đường, v.v. –

0

Tôi không nghĩ rằng chỉ cần thiết lập jpg.CompressionChất lượng một mình là đủ. Bạn cũng nên gọi jpg.Compress() sau đó để thực sự nén hình ảnh ...

Cái gì như:

jpg: = TJPEGImage.Create(); jpg.LoadFromFile ('foo.jpg'); jpg.DIBNeeded(); jpg.CompressionQuality: = 25; jpg.Compress(); jpg.SaveToFile ('bar.jpg'); jpg.Free();

HTH, Dejan

2

tôi đã có vấn đề tương tự như bạn. Đó là giải pháp của tôi.

1) Sử dụng lớp TsdJpegGraphic từ the NativeJPG library thay vì TJPEGImage của Delphi. Đó là mã nguồn mở và miễn phí.

2) Mã:

var 
    Bmp: TBitmap; 
    Jpg: TsdJpegGraphic; 
begin 
    Bmp := TBitmap.Create; 
    Jpg := TsdJpegGraphic.Create; 
    try 
    Bmp.LoadFromFile(BmpFileName); 
    Jpg.CompressionQuality := 100; // !!! 
    Jpg.Assign(Bmp); 
    Jpg.SaveToFile(JpgFileName); 
    finally 
    Jpg.Free; 
    Bmp.Free; 
    end; 
end; 

Điều quan trọng là bạn phải thiết lập thuộc tính CompressionQuality trước khi bạn gán bitmap để Jpg! Nếu bạn đặt lệnh này sau khi gán thì thư viện sẽ sử dụng giá trị mặc định (= 80%) cho CompressionQuality.

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