2012-12-05 17 views
72

में सटीक आकार के साथ एक आकृति निर्दिष्ट और सहेजना कहें कि मेरे आकार 3841 x 7195 पिक्सल की छवि है। मैं आकृति की सामग्री को डिस्क पर सहेजना चाहता हूं, जिसके परिणामस्वरूप सटीक आकार की एक छवि पिक्सेल में निर्दिष्ट है।पिक्सल

कोई अक्ष, कोई शीर्षक नहीं। बस छवि। मैं व्यक्तिगत रूप से डीपीआई की परवाह नहीं करता, क्योंकि मैं केवल डिस्क में स्क्रीन में छवि को पिक्सेल में आकार में निर्दिष्ट करना चाहता हूं।

मैंने otherthreads पढ़ा है, और वे सभी इंच में रूपांतरण करने लगते हैं और फिर आकृति में आकृति के आयाम निर्दिष्ट करते हैं और किसी भी तरह से डीपीआई समायोजित करते हैं। मैं सटीकता के संभावित नुकसान से निपटने से बचना चाहता हूं जो पिक्सेल-टू-इंच रूपांतरणों के परिणामस्वरूप हो सकता है।

मैं के साथ की कोशिश की है: कोई भाग्य के साथ

w = 7195 
h = 3841 
fig = plt.figure(frameon=False) 
fig.set_size_inches(w,h) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 
ax.imshow(im_np, aspect='normal') 
fig.savefig(some_path, dpi=1) 

(? अजगर कि चौड़ाई शिकायत करता है और ऊंचाई प्रत्येक 32768 से नीचे होना चाहिए())

सब कुछ से मैंने देखा है, matplotlib आंकड़ा आकार की आवश्यकता है inches और dpi में निर्दिष्ट करने के लिए, लेकिन मुझे केवल पिक्सेल में डिस्क में लगने वाले चित्रों में रुचि है। मैं यह कैसे कर सकता हूँ?

स्पष्टीकरण के लिए: मैं matplotlib के साथ ऐसा करने का कोई तरीका ढूंढ रहा हूं, न कि अन्य छवि-बचत पुस्तकालयों के साथ।

+0

matplotlib के साथ, आकृति आकार को सीधे इंच में सेट करना संभव नहीं है। – tiago

+0

मेरा मतलब पिक्सल में था ... – tiago

उत्तर

83

Matplotlib सीधे पिक्सल के साथ काम नहीं करता है, बल्कि भौतिक आकार और डीपीआई। यदि आप एक निश्चित पिक्सेल आकार के साथ एक आकृति प्रदर्शित करना चाहते हैं, तो आपको अपने मॉनिटर के डीपीआई को जानना होगा। उदाहरण के लिए this link आपके लिए यह पता लगाएगा।

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

plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi) 

तो तुम मूल रूप से सिर्फ इंच में आयाम अपने डीपीआई से विभाजित: यहाँ मेरा मॉनीटर (my_dpi=96) में एक 800x800 पिक्सेल छवि दिखाने के लिए कैसे।

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

plt.savefig('my_fig.png', dpi=my_dpi) 

एक 8000x8000 पिक्सेल छवि के रूप में सहेजने के लिए, एक डीपीआई 10 गुना बड़ा का उपयोग करें:

plt.savefig('my_fig.png', dpi=my_dpi * 10) 

ध्यान दें कि डीपीआई की स्थापना सभी बैकएंड द्वारा समर्थित नहीं है। यहां, पीएनजी बैकएंड का उपयोग किया जाता है, लेकिन पीडीएफ और पीएस बैकएंड आकार को अलग-अलग लागू करेंगे। इसके अलावा, डीपीआई और आकार बदलने से फोंटसाइज जैसी चीजों को भी प्रभावित किया जाएगा। एक बड़ा डीपीआई फोंट और तत्वों के समान सापेक्ष आकार रखेगा, लेकिन यदि आप बड़े आकार के लिए छोटे फोंट चाहते हैं तो आपको डीपीआई के बजाय भौतिक आकार में वृद्धि करने की आवश्यकता है।

अपने उदाहरण के लिए वापस हो रही है, यदि आप 3841 x 7195 पिक्सल के साथ एक छवि को बचाने के लिए चाहते हैं, आप कर सकता है निम्नलिखित:

plt.figure(figsize=(3.841, 7.195), dpi=100) 
(your code ...) 
plt.savefig('myfig.png', dpi=1000) 

ध्यान दें कि मैं 100 का आंकड़ा डीपीआई इस्तेमाल किया अधिकांश स्क्रीन में फिट करने के लिए , लेकिन आवश्यक संकल्प प्राप्त करने के लिए dpi=1000 के साथ सहेजा गया। मेरे सिस्टम में यह 3840x7190 पिक्सेल के साथ एक पीएनजी उत्पन्न करता है - ऐसा लगता है कि चयनित डीपीआई हमेशा चयनित मूल्य से 0.02 पिक्सल/इंच छोटा होता है, जिसमें बड़े छवि आकारों पर एक (छोटा) प्रभाव होगा। इस here के बारे में कुछ और चर्चा।

+2

यह याद रखना आसान है कि मॉनिटर आकार (और इसलिए मानक ब्राउज़र और यूई विंडो आकार) 96 डीपीआई के 96% के गुणों के मामले में आम तौर पर होते हैं। अचानक 1440 पिक्सल की संख्या अर्थपूर्ण (15 इंच) होती है। जब इस तरह सोचा। –

+0

'figsize' को' plt.figure' में गुजरने के लिए यह नहीं मिल सका। समाधान करना था क्योंकि अन्य उत्तरों सुझाव देते हैं और इसे _without_ 'figsize' कहने के बाद, फिर' fig.set_size_inches (w, h) ' – Trinidad

+0

कॉल करें [' figure'] के लिए डॉक्स (https://matplotlib.org/api/ pyplot_api.html # matplotlib.pyplot.figure) और ['savefig'] (https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig)। – handle

10

यह मेरे लिए काम किया, अपने कोड के आधार पर, एक 93Mb रंग शोर और वांछित आयामों के साथ छवि png पैदा:

import matplotlib.pyplot as plt 
import numpy 

w = 7195 
h = 3841 

im_np = numpy.random.rand(h, w) 

fig = plt.figure(frameon=False) 
fig.set_size_inches(w,h) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 
ax.imshow(im_np, aspect='normal') 
fig.savefig('figure.png', dpi=1) 

मैं लिनक्स में अजगर 2.7 पुस्तकालयों के अंतिम PIP संस्करणों का उपयोग कर रहा टकसाल 13

आशा है कि मदद करता है!

+2

बहुत कम डीपीआई सेट करना मतलब होगा कि फ़ॉन्ट्स शायद ही दिखाई देगी, जब तक कि बहुत बड़े फ़ॉन्ट आकार स्पष्ट रूप से उपयोग नहीं किए जाते। – tiago

+1

यह संभव है कि उच्च डीपीआई सेट करें और उस डीपीआई द्वारा अपने इंच के आकार को विभाजित करें (जो कि मनमाने ढंग से है)। इसके अलावा, आपका सेटअप पिक्सेल प्रजनन के लिए एक सटीक पिक्सेल उत्पन्न करता है, धन्यवाद! – FrenchKheldar

+0

मैं इस पर साजिश तत्वों के साथ चित्रों को सहेजने से पहले इसका उपयोग करने की कोशिश कर रहा हूं (मंडल, रेखाएं, ...)। यह लाइनविड्थ dist distbs, ताकि तत्व मुश्किल से दिखाई दे रहे हैं। – Gauthier

संबंधित मुद्दे