2010-06-23 19 views
5

का उपयोग कर bmp से jpg में कनवर्ट करने में समस्या मेरे पास एक बीएमपी फ़ाइल है और इसे jpeg प्रारूप में बदलने की कोशिश कर रहा हूं। निम्नलिखित कोड का उपयोग करके बनाया गया जेपीजी बहुत स्पष्टता खो देता है। मैंने बिना किसी लाभ के कई सेटिंग्स को ट्वीव करने का प्रयास किया है।TJpegImage घटक

क्या किसी के पास कोई ऐसा फ़ंक्शन है जो एक बीएमपी फ़ाइल को जेपीईजी में परिवर्तित करेगा?

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; 

अद्यतन द्वितीय लोगों का एक बहुत प्रतिक्रिया व्यक्त की है कि jpeg इस मामले में उपयोग करने के लिए ग्राफिक प्रकार नहीं है। समझ लिया। एक मृत घोड़े को हरा नहीं, लेकिन मैं अन्य कार्यक्रमों (यानी फ़ोटोशॉप) का उपयोग करने में सक्षम हूं और इसे एक अच्छी लग रही जेपीईजी में परिवर्तित कर सकता हूं। और जिस टूल का उपयोग मैं चार्ट (फ़्यूज़नचार्ट्स) बनाने के लिए कर रहा हूं वह इसे एक अच्छी लग रही जेपीईजी को भी निर्यात करने में सक्षम है (नीचे देखें)। अंतर क्या है?

+0

मुझे नहीं पता कि यह समस्या है या नहीं। आप बीएमपी को जेपीजी को असाइन करने से पहले आपको गुणवत्ता सेटिंग सेट करना चाहेंगे। रूपांतरण असाइनमेंट पर हो सकता है और फ़ाइल को सहेज नहीं सकता है। –

+0

@gbrandt: नहीं, कथन पूरी तरह ठीक है जहां यह है। –

+1

मैंने कुछ इस पर अनुवर्ती किया। जो मैं इकट्ठा कर सकता हूं, वह savetofile कॉल के दौरान स्पष्टता खो देता है। मेरी परियोजना में मैंने एक टीआईएमज जोड़ा और इसे जेपीईजी असाइन किया। यह ठीक है। –

उत्तर

1

के रूप में अन्य लोगों ने कहा, जेपीईजी बस गलत छवि उस तरह के लिए प्रारूप है - और उच्च आवृत्ति क्रोमा किनारों के साथ, आप संभवतः के लिए बुरी से बुरी हालत छवियों में से एक है जेपीईजी!

मैं आपको Paint.Net की एक प्रति प्राप्त करने की सलाह देता हूं, और विभिन्न प्रारूपों (पीएनजी, जेपीईजी, जीआईएफ, बीएमपी, आदि) में छवियों को सहेजने/पूर्वावलोकन करने का प्रयास करता हूं और छवि आकार, गुणवत्ता और प्रदर्शन के बीच व्यापार-बंद करने का अनुभव करता हूं ।

मैंने अपनी टेस्ट छवि को पेंट.net के साथ जेपीईजी के रूप में सहेजने की कोशिश की है, और डेल्फी आपको बिल्कुल वही गुणवत्ता मिलती है, इसलिए आप (या डेल्फी) क्या कर रहे हैं, इसके साथ अब गलत है ...

अद्यतन: According to Wikipedia...

वहाँ एक वैकल्पिक दोषरहित मोड जेपीईजी मानक में परिभाषित है, हालांकि, वह मोड उत्पादों में व्यापक रूप से समर्थित नहीं है।

मुझे लगता है कि फ़्यूज़नशर्ट्स और फ़ोटोशॉप के पास इस मोड को निर्दिष्ट करने का एक तरीका है। इसका सामान्य रूप से उपयोग नहीं किया जाता है, क्योंकि जेपीईजी को आमतौर पर लोसी संपीड़न के समानार्थी माना जाता है।

संक्षेप में, जबकि जेपीईजी फाइलें लापरवाही संपीड़न का समर्थन कर सकती हैं, जेपीईजी एक आदर्श प्रारूप नहीं है क्योंकि यह व्यापक रूप से समर्थित नहीं है। यदि आप लापरवाही चाहते हैं, तो पीएनजी बेहतर विकल्प बनी हुई है। आपकी छवि का पीएनजी-संपीड़ित संस्करण लापरवाही से संपीड़ित जेपीईजी एक (71 के बनाम 101 के)

+0

आपकी विस्तृत प्रतिक्रिया के लिए धन्यवाद। तो "बिग" तस्वीर का उत्तर जेपीईजी का उपयोग नहीं करना है।लेकिन मैं समझ नहीं पा रहा हूं कि कुछ प्रोग्राम इसे जेपीजी प्रारूप में कैसे सहेजने में सक्षम हैं और फिर भी यह अच्छा दिखता है। मैंने उपरोक्त एक नई जेपीईजी फाइल जोड़ दी है। यह जेपीजी अच्छी तरह से प्रस्तुत करने में सक्षम कैसे है? –

4

यदि आप जितनी कम संभव हो उतनी गुणवत्ता खोना चाहते हैं, तो आपको जितना संभव हो उतना कम संपीड़ित करना चाहिए, यानी CompressionQuality := 100 सेट करें।

अद्यतन

JPG छवि प्रारूप बनाया गया है तस्वीरों और इसी तरह रेखापुंज चित्रों के साथ प्रयोग की जाने वाली। फ़ाइल आकार को कम करने के लिए जेपीजी विनाशकारी संपीड़न को नियोजित करता है। हालांकि, इस संपीड़न के दृश्य प्रभाव बड़े गुणवत्ता मूल्यों (> ~ 80) के लिए न के बराबर है क्योंकि तस्वीरों एक ही रंग, बहुत ही नियमित आकार, आदि के बड़े क्षेत्रों शामिल नहीं है

JPG प्रारूप कभी नहीं इस्तेमाल किया जाना चाहिए फोटोग्राफिक चित्रों के अलावा कुछ भी के लिए। उदाहरण के लिए, चित्र, स्क्रीनशॉट, आदि, जिसमें सटीक रंग के बड़े क्षेत्र होते हैं, बहुत नियमित आकार इत्यादि, जेपीजी संपीड़ित होने पर स्पष्ट कलाकृतियों को प्रदर्शित करेंगे। इस प्रकार के रास्टर छवियों के लिए, पीएनजी का उपयोग करें। पीएनजी भी एक संकुचित प्रारूप है (एक बहुत, बहुत अच्छा प्रारूप भी!), लेकिन संपीड़न गैर विनाशकारी है।

तो कृपया अपने आरेख के लिए जेपीजी का उपयोग न करें! पीएनजी का प्रयोग करें!

+0

संपीड़न गुणवत्ता बदलना इससे प्रभावित नहीं होता है (मैंने अपनी मूल पोस्ट में मान अपडेट किया है)। –

+0

ठीक है धन्यवाद। "बड़ी तस्वीर" उत्तर ऐसा प्रतीत होता है कि जेपीईजी लागू ग्राफिक प्रकार नहीं है। लेकिन, ऊपर मेरे अद्यतन द्वितीय पढ़ें। ऐसा लगता है कि यह वास्तव में एक सम्मानजनक जेपीजी में परिवर्तित किया जा सकता है। ऐसा क्यों है? –

1

के रूप में एंड्रियास कहा, जैक अप 100 को CompressionQuality आप एक और उदाहरण की कोशिश करना चाहते हैं, तो डॉ बॉब (अक्सर अतः योगदानकर्ता) यहाँ एक अच्छा writeup है:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5031886.html#

वह कोड है एक धारा दृष्टिकोण का उपयोग करता है। मैं एक ही परिणाम की उम्मीद करता हूं, लेकिन आप कभी नहीं जानते। कोड यह रहा:
https://web.archive.org/web/1/http://techrepublic%2ecom%2ecom/html/tr/sidebars/5031886-1.html

+0

कोशिश की - एक ही परिणाम। क्या आप एक जेपीजी के साथ एक ही परिणाम प्राप्त करने की गारंटी दे सकते हैं? –

+0

@MSchenkel - नहीं, जेपीजी एक हानिकारक एल्गोरिदम है, और बीएमपी के समान परिणाम नहीं देगा। सर्वोत्तम परिणामों के लिए जीआईएफ या पीएनजी का प्रयोग करें। जेपीजी तस्वीरों के लिए संतोषजनक होगा, लेकिन आपको स्क्रीनशॉट, टेक्स्ट, लाइन ड्रॉइंग इत्यादि के साथ "मच्छर" कलाकृतियों को देखेंगे। –

0

से मुझे 30% छोटा है, मुझे लगता है कि केवल jpg.CompressionQuality को पर्याप्त नहीं है। तुम भी jpg.Compress (बुलाना चाहिए) बाद में वास्तव में छवि को संपीड़ित करने के ...

कुछ की तरह:

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

HTH, डेजन

2

मैं तुम्हें रूप में एक ही समस्या थी। यह मेरा समाधान है।

1) डेल्फी के TJPEGImage के बजाय the NativeJPG library से TsdJpegGraphic कक्षा का उपयोग करें। यह मुफ़्त और खुला स्रोत है।

2) कोड:

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; 

यह इससे पहले कि आप JPG में बिटमैप आवंटित CompressionQuality गुण सेट करने के लिए महत्वपूर्ण है! यदि आप असाइन करने के बाद यह आदेश डालते हैं तो लाइब्रेरी संपीड़न गुणवत्ता के लिए डिफ़ॉल्ट मान (= 80%) का उपयोग करेगी।