libpng चेतावनी: iCCP: ज्ञात गलत sRGB प्रोफ़ाइल


173

मैं SDL का उपयोग करके PNG छवि लोड करने का प्रयास कर रहा हूं, लेकिन प्रोग्राम काम नहीं करता है और यह त्रुटि कंसोल में दिखाई देती है

libpng चेतावनी: iCCP: ज्ञात गलत sRGB प्रोफ़ाइल

यह चेतावनी क्यों दिखाई देती है? इस समस्या को हल करने के लिए मुझे क्या करना चाहिए?



जवाबों:


180

Libpng-1.6 पिछले संस्करणों की तुलना में ICC प्रोफाइल की जाँच करने में अधिक कठोर है। आप चेतावनी को अनदेखा कर सकते हैं। इससे छुटकारा पाने के लिए, PNG इमेज से iCCP चंक को हटा दें।

कुछ एप्लिकेशन चेतावनी को त्रुटियों के रूप में मानते हैं; यदि आप ऐसे किसी एप्लिकेशन का उपयोग कर रहे हैं तो आपको चंक को हटाना होगा। आप किसी भी तरह के PNG संपादकों के साथ कर सकते हैं जैसे कि ImageMagick

convert in.png out.png

सभी PNG फ़ाइलों को फ़ोल्डर (निर्देशिका) में से अवैध iCCP चंक हटाने के लिए, आप mogrifyImageMagick से उपयोग कर सकते हैं :

mogrify *.png

इसके लिए आवश्यक है कि आपका ImageMagick libpng16 के साथ बनाया गया था। आप इसे चलाकर आसानी से देख सकते हैं:

convert -list format | grep PNG

यदि आप यह पता लगाना चाहते हैं कि उन सभी को आँख बंद करके संसाधित करने के बजाय किन फ़ाइलों को ठीक करने की आवश्यकता है, तो आप चला सकते हैं

pngcrush -n -q *.png

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


ImageMagick के बाइनरी रिलीज़ यहां हैं


Android प्रोजेक्ट्स (Android Studio) के लिए resफ़ोल्डर में नेविगेट करें ।

उदाहरण के लिए:

C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png

13
ImageMagick से आप -strip कमांड का उपयोग कर सकते हैं । विशेष रूप से, मैंने एक फ़ोल्डर में सभी छवियों को प्रभावित करने के लिए mogrify का उपयोग किया । मेरी आज्ञा कुछ इस तरह दिखी
Maxito

24
-Strip विकल्प सभी प्रोफाइल को हटा देगा। यदि आप -strip विकल्प को छोड़ देते हैं ( * .png ), केवल गलत प्रोफ़ाइल हटा दी जाएगी।
ग्लेन रैंडर्स-पीरसन

2
क्या यह पता लगाने का एक तरीका है कि कौन सी फ़ाइल चेतावनी को ट्रिगर कर रही है? रनिंग mogrify **/*.pngपेड़ की सभी फाइलों को संशोधित करती है। मैं केवल एक दोषपूर्ण छवि को अपडेट करना पसंद करूंगा।
यूफ्लेक्स

1
वर्तमान निर्देशिका में फ़ाइलों find . -type f -name '*.png' -execute mogrify \{\} \;को पुन: संशोधित करने के लिए उपयोग करें .png
वैल का कहना है कि मोनिका

अगर ImageMagick बायनेरिज़ ने मेरे कंप्यूटर को फ्रीज कर दिया, शायद बहुत मेहनत करने से, और रात भर छोड़ने के बाद, जबरदस्ती फिर से शुरू करना पड़ा। -owफ़ाइल को अधिलेखित करने और ठीक करने के लिए समस्या का पता लगाने के लिए pngcrush एप्लिकेशन का उपयोग किया , और आकार को भी लगभग 1/6 घटा दिया! बस मुझे अपने मैक के लिए प्रोग्राम का सोर्स कोड प्राप्त करना था, संकलित करना, मैन्युअल रूप से इंस्टॉल करना और उसे चलाना। GitHub Kjuly / pngcrush में एक पूर्वनिर्धारित बाइनरी हो सकती है, लेकिन निश्चित नहीं है। Sourceforge को केवल Windows exe के उपलब्ध और स्रोत कोड ही प्रतीत होते थे। friederbluemle का जवाब यह और अधिक करने के लिए लगता है।
3

73

pngcrushPng फ़ाइल से गलत sRGB प्रोफ़ाइल को निकालने के लिए उपयोग करें :

pngcrush -ow -rem allb -reduce file.png
  • -ow इनपुट फ़ाइल को अधिलेखित करेगा
  • -rem allb tRNS और gAMA को छोड़कर सभी सहायक विखंडू हटा देंगे
  • -reduce दोषरहित रंग-प्रकार या बिट-डेप्थ रिडक्शन को कम करता है

कंसोल आउटपुट में आपको देखना चाहिए Removed the sRGB chunk, और संभवतः चंक हटाने के बारे में अधिक संदेश। आप एक छोटी, अनुकूलित PNG फ़ाइल के साथ समाप्त हो जाएंगे। जैसा कि कमांड मूल फ़ाइल को अधिलेखित करेगा, बैकअप बनाना या संस्करण नियंत्रण का उपयोग करना सुनिश्चित करें।


7
वह काम किया! में (* .png) कर PNGCRUSH.EXE -ow -rem allb -reduce %% मैं के लिए / आर %% मैं: वर्तमान फ़ोल्डर से रिकर्सिवली यह करना है एक .bat फ़ाइल में इस डाल
एंडी ब्राईस

13
और वर्तमान निर्देशिका में सभी पीएनजी फ़ाइलों को पुन: रूप से ठीक करने के लिए * निक्स के लिए एक-लाइनर: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(जीएनयू / लिनक्स पर परीक्षण किया गया)
तले हुए बीबर

2
फ्राइडर द्वारा ऊपर की रेखा खिड़कियों के साथ-साथ गिट बश के अंदर भी काम करती है।
आईकेआरआर

Pngcrush मेरे मामले में यह हिस्सा नहीं निकालता है। लेकिन इमेजमैजिक के मोगरिफाई ने ऐसा किया।
निकोस २

25

उपाय

गलत प्रोफ़ाइल को इसके द्वारा ठीक किया जा सकता है:

  1. QPixmap :: लोड का उपयोग करके गलत प्रोफ़ाइल के साथ छवि को खोलना
  2. QPixmap :: save का उपयोग करके छवि को डिस्क पर वापस (पहले से ही सही प्रोफाइल के साथ) सहेजा जा रहा है

नोट: यह समाधान Qt लाइब्रेरी का उपयोग करता है ।

उदाहरण

यहाँ एक न्यूनतम उदाहरण है जो मैंने C ++ में लिखा है ताकि प्रस्तावित समाधान को लागू करने के तरीके को प्रदर्शित किया जा सके:

QPixmap pixmap;
pixmap.load("badProfileImage.png");

QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");

इस उदाहरण के आधार पर GUI एप्लिकेशन का पूर्ण स्रोत कोड GitHub पर उपलब्ध है

05.12.2019 से अद्यतन: उत्तर था और अभी भी मान्य है, लेकिन जीयूआई आवेदन में एक बग था जिसे मैंने गीथहब पर साझा किया है, जिससे आउटपुट छवि खाली हो गई है। मैंने अभी इसे ठीक किया है और असुविधा के लिए माफी माँगता हूँ!


4
मुझे आश्चर्य है कि यह उत्तर नहीं मिला। इसे कुछ भी स्थापित करने की आवश्यकता नहीं है और यह काम करता है ... एक और क्या माँग सकता है :)
क्वांटुपल

17

आप इसे भी फ़ोटोशॉप में ठीक कर सकते हैं ...

  1. अपनी .png फ़ाइल खोलें।
  2. फ़ाइल -> इस रूप में और "आईसीसी प्रोफाइल: sRGB IEC61966-2.1 अनचेक" खोलने वाले संवाद में सहेजें
  3. "कॉपी के रूप में" को अनचेक करें।
  4. साहसपूर्वक अपने मूल .png पर सहेजें।
  5. अपने जीवन के साथ आगे बढ़ें यह जानकर कि आपने दुनिया से बस थोड़ी सी बुराई को हटा दिया है।

8

ग्लेन के महान जवाब में जोड़ने के लिए, यहां मैंने यह पाया कि कौन सी फाइलें दोषपूर्ण थीं:

find . -name "*.png" -type f -print0 | xargs \
       -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1

मैंने खोज और xargs का उपयोग किया क्योंकि pngcrush बहुत सारे तर्कों को संभाल नहीं सका (जो कि वापस आ गए थे **/*.png)। -print0और -0संभाल फ़ाइल रिक्त स्थान युक्त नाम की आवश्यकता है।

फिर इन पंक्तियों के लिए आउटपुट में खोजें iCCP: Not recognizing known sRGB profile that has been edited:।

./Installer/Images/installer_background.png:    
Total length of data found in critical chunks            =     11286  
pngcrush: iCCP: Not recognizing known sRGB profile that has been edited

और उनमें से प्रत्येक के लिए, उन्हें ठीक करने के लिए उस पर mogrify चलाएं।

mogrify ./Installer/Images/installer_background.png

ऐसा करने से रिपॉजिटरी में हर एक पीएनजी फाइल को कमिट करने से रोकता है, जब केवल कुछ को वास्तव में संशोधित किया गया है। प्लस में यह दिखाने का फायदा है कि कौन सी फाइलें दोषपूर्ण थीं।

मैंने इसे सिगविन कंसोल और एक ज़श शेल के साथ विंडोज पर परीक्षण किया । ग्लेन के लिए फिर से धन्यवाद जिन्होंने सबसे ऊपर रखा, मैं सिर्फ एक जवाब जोड़ रहा हूं क्योंकि यह आमतौर पर टिप्पणियों की तुलना में आसान है :)


3
डेबियन पर, मेरे सॉफ़्टवेयर में समस्याग्रस्त फ़ाइलों को खोजने के लिए, मैंने find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;हर गलत PNG का उपयोग कियाpngcrush: iCCP: known incorrect sRGB profile
गेब्रियल डेविलर्स

7

के लिए धन्यवाद शानदार जवाब से ग्लेन , मैं इस्तेमाल किया ImageMagik के "mogrify * .png" कार्यक्षमता। हालाँकि, मुझे उप-फ़ोल्डरों में दफनाए गए चित्र थे, इसलिए मैंने इस सरल पायथन स्क्रिप्ट का उपयोग सभी उप-फ़ोल्डरों में सभी छवियों पर लागू करने के लिए किया और सोचा कि यह दूसरों की मदद कर सकती है:

import os
import subprocess

def system_call(args, cwd="."):
    print("Running '{}' in '{}'".format(str(args), cwd))
    subprocess.call(args, cwd=cwd)
    pass

def fix_image_files(root=os.curdir):
    for path, dirs, files in os.walk(os.path.abspath(root)):
        # sys.stdout.write('.')
        for dir in dirs:
            system_call("mogrify *.png", "{}".format(os.path.join(path, dir)))


fix_image_files(os.curdir)

2
यह अच्छी तरह से क्रॉस-प्लेटफ़ॉर्म है, हालांकि यदि आप एक ऐसे प्लेटफ़ॉर्म पर हैं जो एक अच्छा * NIX-y शेल जैसे Zsh या बैश का समर्थन करता है, तो आप बस उपयोग कर सकते हैं mogrify **/*.png
काइल स्ट्रैंड

1
हाँ, अच्छी बात है। मैंने केवल पायथन का उपयोग किया है क्योंकि हम विंडोज और लिनक्स पर विकसित होते हैं और भविष्य में उपयोग के लिए इस स्क्रिप्ट को अपने रेपो के लिए प्रतिबद्ध करना चाहते हैं।
देवन विलियम्स

5

मैक ओएस और होमब्रे के साथ इस मुद्दे को ठीक करने का एक आसान तरीका है:

यदि यह अभी तक स्थापित नहीं है, तो होमब्रे को स्थापित करें

$brew install libpng
$pngfix --strip=color --out=file2.png file.png

या वर्तमान निर्देशिका में हर फ़ाइल के साथ करने के लिए:

mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done

यह वर्तमान निर्देशिका में प्रत्येक पीएनजी फ़ाइल के लिए एक निश्चित प्रतिलिपि बनाएगा और इसे tmp उपनिर्देशिका में डालेगा। उसके बाद, यदि सब कुछ ठीक है, तो आपको बस मूल फ़ाइलों को ओवरराइड करने की आवश्यकता है।

एक और टिप आइकन बनाने के लिए कीनोट और पूर्वावलोकन अनुप्रयोगों का उपयोग करना है। मैं उन्हें लगभग 120x120 पिक्सल के आकार में कीनोट का उपयोग करके आकर्षित करता हूं, एक सफेद पृष्ठभूमि के साथ एक स्लाइड पर (बहुभुज को संपादन योग्य बनाने का विकल्प बहुत अच्छा है!)। पूर्वावलोकन करने के लिए निर्यात करने से पहले, मैं आइकन के चारों ओर एक आयत (बिना किसी भराव या छाया के, बस रूपरेखा, लगभग 135x135 के आकार के साथ) आकर्षित करता हूं और क्लिपबोर्ड पर सब कुछ कॉपी करता हूं। उसके बाद, आपको बस "क्लिपबोर्ड से नया" का उपयोग करके पूर्वावलोकन टूल के साथ इसे खोलने की आवश्यकता है, आइकन के चारों ओर 128x128 पिक्सेल क्षेत्र का चयन करें, फिर से, "क्लिपबोर्ड से नया" का उपयोग करें, और इसे पीएनजी को निर्यात करें। आपको pngfix टूल को चलाने की आवश्यकता नहीं होगी।


1
मुझे मानक OS El Capitan स्थापना में pngfix नहीं मिला (या शायद मैंने अच्छी तरह से खोज नहीं की थी), लेकिन मैंने इसे MAMP स्थापना में पाया जो मेरे पास था। पूरी तरह से काम किया! धन्यवाद! Upvoted
गुइडो

तुम सही हो! मैं एक लंबे समय से पहले "काढ़ा स्थापित libpng" के साथ इसे स्थापित किया था।
एड्रिएल जूनियर

जब मुझे 10.13.2 पर यह चल रहा होता है, तो मुझे "n! Ew ERR 08 पढ़ा गया है।
मिच

@ मिच अभी भी 10.13.6 के उन्नयन के बाद ठीक चलता है।
एड्रिएल जूनियर

4

इस पृष्ठ पर कुछ सुझावों की कोशिश करने के बाद मैंने pngcrush समाधान का उपयोग करके समाप्त किया। खराब पीएनजी प्रोफाइल का पता लगाने और उसे ठीक करने के लिए आप नीचे दिए गए बैश स्क्रिप्ट का उपयोग कर सकते हैं। बस उस निर्देशिका के लिए पूर्ण पथ पास करें जिसे आप पीएनजी फ़ाइलों के लिए खोजना चाहते हैं।

fixpng "/path/to/png/folder"

लिपी:

#!/bin/bash

FILES=$(find "$1" -type f -iname '*.png')

FIXED=0
for f in $FILES; do
    WARN=$(pngcrush -n -warn "$f" 2>&1)
    if [[ "$WARN" == *"PCS illuminant is not D50"* ]] || [[ "$WARN" == *"known incorrect sRGB profile"* ]]; then
        pngcrush -s -ow -rem allb -reduce "$f"
        FIXED=$((FIXED + 1))
    fi
done

echo "$FIXED errors fixed"

2
यह अधिक उत्थान के योग्य है। अन्य सभी समाधान प्रत्येक फ़ाइल को स्पर्श करते हैं , जो विशेष रूप से खराब है यदि आपके पास संस्करण-नियंत्रण प्रणाली में बहुत सारी छवियां हैं। स्क्रिप्ट के लिए धन्यवाद!
kfunk

मेरे पास है pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8लेकिन मेरे pngcrush में झंडे नहीं हैं -warnऔर -reduceइसलिए यह समाधान काम नहीं करता है।
pbhj

4

इस पर कुछ पृष्ठभूमि जानकारी:

Libpng संस्करण 1.6+ में कुछ बदलाव इसकी वजह से चेतावनी जारी करते हैं या यहां तक ​​कि मूल HP / MS sRGB प्रोफ़ाइल के साथ सही तरीके से काम नहीं करने के कारण, निम्नलिखित stderr के लिए अग्रणी होता है: libpng चेतावनी: iCCP: ज्ञात गलत sRGB प्रोफ़ाइल पुराना D50 व्हाइटपॉइंट का उपयोग करता है, जहाँ D65 मानक है। यह प्रोफ़ाइल असामान्य नहीं है, जिसका उपयोग एडोब फोटोशॉप द्वारा किया जा रहा है, हालांकि यह डिफ़ॉल्ट रूप से छवियों में एम्बेडेड नहीं था।

(स्रोत: https://wiki.archlinux.org/index.php/Libpng_errors )

कुछ विखंडू में त्रुटि का पता चला है; विशेष रूप से iCCP चंक रीडर में अब मूल प्रारूप का पूर्ण सत्यापन होता है। कुछ खराब प्रोफाइल जिन्हें पहले स्वीकार किया गया था, अब खारिज कर दिया गया है, विशेष रूप से बहुत पुरानी टूटी हुई Microsoft / HP sRGB प्रोफाइल। PNG कल्पना की आवश्यकता है कि केवल ग्रेस्केल प्रोफाइल रंग प्रकार 0 या 4 के साथ छवियों में दिखाई दे सकते हैं और यह कि भले ही छवि में केवल ग्रे पिक्सेल हों, केवल RGB प्रोफाइल रंग प्रकार 2, 3, या 6 के साथ छवियों में दिखाई दे सकती हैं, अब इसे लागू किया गया है। SRGB चंक को किसी भी रंग प्रकार के साथ छवियों में प्रदर्शित करने की अनुमति है।

(स्रोत: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-ogn-incorrect-srgb-profile-drive-me-nuts/16 )


3

विंडोज में इरफान व्यू इमेज व्यूअर का उपयोग करते हुए, मैंने बस PNG इमेज को फिर से शुरू किया और इस समस्या को ठीक किया।


1

फ्राइडेरब्लुमेले सॉल्यूशन का विस्तार करते हुए, pngcrush डाउनलोड करें और फिर इस तरह कोड का उपयोग करें यदि आप इसे कई पीएनजी फ़ाइलों पर चला रहे हैं

path =r"C:\\project\\project\\images" # path to all .png images
import os

png_files =[]

for dirpath, subdirs, files in os.walk(path):
    for x in files:
        if x.endswith(".png"):
            png_files.append(os.path.join(dirpath, x))

file =r'C:\\Users\\user\\Downloads\\pngcrush_1_8_9_w64.exe' #pngcrush file 


for name in png_files:
    cmd = r'{} -ow -rem allb -reduce {}'.format(file,name)
    os.system(cmd)

यहां परियोजनाओं से संबंधित सभी पीएनजी फ़ाइल 1 फ़ोल्डर में हैं।


0

मैंने उन दो कमांडों को प्रोजेक्ट के रूट और उसके निश्चित भाग में चलाया।

मूल रूप से प्रक्रिया के लिए फ़ाइलों की अपनी सूची के रूप में उपयोग करने के लिए एक पाठ फ़ाइल के लिए "खोज" कमांड के आउटपुट को पुनर्निर्देशित करें। फिर आप "@" ध्वज का उपयोग करके उस पाठ फ़ाइल को "mogrify" में पढ़ सकते हैं:

* .png -mtime -1> list.txt खोजें

mogrify -resize 50% @ list.txt

जो कि सभी * .png चित्रों को 1 दिन से नया पाने के लिए "खोज" का उपयोग करेगा और उन्हें "list.txt" नामक फ़ाइल में प्रिंट करेगा। तब "mogrify" उस सूची को पढ़ता है, छवियों को संसाधित करता है, और आकार के संस्करणों के साथ मूल को अधिलेखित करता है। एक सिस्टम से दूसरे सिस्टम में "ढूंढें" के व्यवहार में मामूली अंतर हो सकता है, इसलिए आपको सटीक उपयोग के लिए मैन पेज की जांच करनी होगी।


-2

यहाँ एक हास्यास्पद क्रूरतापूर्ण जवाब है:

मैंने gradlew स्क्रिप्ट को संशोधित किया। यहाँ फ़ाइल के अंत में मेरा नया निष्पादन कमांड है

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.