libpng-waarschuwing: iCCP: bekend onjuist sRGB-profiel

Ik probeer een PNG-afbeelding te laden met SDL, maar het programma werkt niet en deze fout verschijnt in de console

libpng-waarschuwing: iCCP: bekend onjuist sRGB-profiel

Waarom verschijnt deze waarschuwing? Wat moet ik doen om dit probleem op te lossen?


Antwoord 1, autoriteit 100%

Libpng-1.6 is strenger in het controleren van ICC-profielen dan eerdere versies. U kunt de waarschuwing negeren. Om er vanaf te komen, verwijdert u de iCCP-brok uit de PNG-afbeelding.

Sommige toepassingen behandelen waarschuwingen als fouten; als je zo’n applicatie gebruikt, moet je de chunk verwijderen. U kunt dat doen met een van de verschillende PNG-editors zoals ImageMagick’s

convert in.png out.png

Om de ongeldige iCCP-chunk uit alle PNG-bestanden in een map (directory) te verwijderen, kunt u mogrifyvan ImageMagick gebruiken:

mogrify *.png

Dit vereist dat uw ImageMagick is gebouwd met libpng16. Je kunt het gemakkelijk controleren door het volgende uit te voeren:

convert -list format | grep PNG

Als u wilt weten welke bestanden moeten worden hersteld in plaats van ze allemaal blindelings te verwerken, kunt u uitvoeren

pngcrush -n -q *.png

waar de -nbetekent: herschrijf de bestanden niet en -qbetekent onderdruk het grootste deel van de uitvoer, behalve voor waarschuwingen. Sorry, er is nog geen optie in pngcrush om alles behalve de waarschuwingen te onderdrukken.


Binaire releases van ImageMagick zijn hier


Voor Android-projecten (Android Studio) navigeert u naar de map res.

Bijvoorbeeld:

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

Antwoord 2, autoriteit 38%

Gebruik pngcrushom het onjuiste sRGB-profiel uit het png-bestand te verwijderen :

pngcrush -ow -rem allb -reduce file.png
  • -owzal het invoerbestand overschrijven
  • -rem allbverwijdert alle aanvullende chunks behalve tRNS en gAMA
  • -reducedoet verliesvrije kleurtype- of bitdieptereductie

In de console-uitvoer zou je Removed the sRGB chunk, en mogelijk meer berichten over het verwijderen van chunks. Je krijgt dan een kleiner, geoptimaliseerd PNG-bestand. Aangezien de opdracht het originele bestand zal overschrijven, moet u ervoor zorgen dat u een back-up maakt of versiebeheer gebruikt.


Antwoord 3, autoriteit 13%

Oplossing

Het onjuiste profiel kan worden verholpen door:

  1. De afbeelding openen met het onjuiste profiel met QPixmap::load
  2. De afbeelding terug opslaan op de schijf (al met het juiste profiel) met QPixmap::opslaan

Opmerking:deze oplossing gebruikt de Qt-bibliotheek.

Voorbeeld

Hier is een minimaal voorbeeld dat ik in C++ heb geschreven om te demonstreren hoe de voorgestelde oplossing te implementeren:

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

De volledige broncode van een GUI-toepassing op basis van dit voorbeeld is beschikbaar op GitHub.

UPDATE VAN 05.12.2019:het antwoord was en is nog steeds geldig, maar er was een fout in de GUI-toepassing die ik op GitHub heb gedeeld, waardoor de uitvoerafbeelding leeg was. Ik heb het zojuist opgelost en excuses voor het ongemak!


Antwoord 4, autoriteit 9%

Je kunt dit ook gewoon oplossen in photoshop…

  1. Open je .png-bestand.
  2. Bestand -> Opslaan als en in het dialoogvenster dat wordt geopend verwijder het vinkje bij “ICC-profiel: sRGB IEC61966-2.1”
  3. Deselecteer “Als kopie”.
  4. Moedig opslaan over je originele .png.
  5. Ga verder met je leven in de wetenschap dat je net dat beetje kwaad uit de wereld hebt verwijderd.

Antwoord 5, autoriteit 4%

Om toe te voegen aan Glenns geweldige antwoord, hier is wat ik deed om te achterhalen welke bestanden defect waren:

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

Ik gebruikte de find en xargs omdat pngcrush niet veel argumenten aankon (die werden geretourneerd door **/*.png). De -print0en -0zijn vereist om bestandsnamen met spaties te verwerken.

Zoek vervolgens in de uitvoer naar deze regels: 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

En voor elk van deze, voer mogrify erop uit om ze te repareren.

mogrify ./Installer/Images/installer_background.png

Als je dit doet, wordt voorkomen dat een commit elk afzonderlijk png-bestand in de repository wijzigt terwijl er slechts een paar daadwerkelijk zijn gewijzigd. Bovendien heeft het het voordeel om precies te laten zien welke bestanden defect waren.

Ik heb dit getest op Windows met een Cygwin-consoleen een zsh-shell. Nogmaals bedankt aan Glenndie het meeste van het bovenstaande heeft geplaatst, ik voeg gewoon een antwoord toe omdat het meestal gemakkelijker is te vinden dan reacties 🙂


Antwoord 6, autoriteit 4%

Dankzij het fantastische antwoordvan Glenn, heb ik ImageMagik‘s “mogrify *.png” functionaliteit. Ik had echter afbeeldingen begraven in submappen, dus ik gebruikte dit eenvoudige Python-script om dit op alle afbeeldingen toe te passen in alle submappen en dacht dat het anderen zou kunnen helpen:

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)

Antwoord 7, Autoriteit 4%

Er is een eenvoudiger manier om dit probleem op te lossen met Mac OS en Homebrew:

Installeer Homebrew als deze nog niet is geïnstalleerd

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

of om het met elk bestand in de huidige directory te doen:

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

Het maakt een vaste kopie voor elk PNG-bestand in de huidige map en zet deze in de TMP-subdirectory. Daarna, als alles in orde is, moet u alleen de originele bestanden overschrijven.

Nog een tip is om de keynote en voorbeeldtoepassingen te gebruiken om de pictogrammen te maken. Ik ze tekenen met Keynote, in de grootte van ongeveer 120×120 pixels, meer dan een dia met een witte achtergrond (de mogelijkheid om polygonen bewerkbaar is geweldig!). Voordat u exporteert naar een preview, teken ik een rechthoek rond het pictogram (zonder enige vulling of schaduw, alleen de omtrek, met de grootte van ongeveer 135×135) en kopieer alles naar het klembord. Daarna moet u het gewoon openen met het voorbeeldgereedschap met behulp van “nieuw van het klembord”, selecteer een 128×128 pixels-gebied rond het pictogram, kopieer, gebruik “nieuw van het klembord” opnieuw en exporteer deze naar PNG. U hoeft de PNGFIX-tool niet uit te voeren.


Antwoord 8, Autoriteit 2%

Na een aantal suggesties op deze pagina te hebben geprobeerd, heb ik uiteindelijk de pngcrush-oplossing gebruikt. U kunt het onderstaande bash-script gebruiken om recursief slechte png-profielen te detecteren en op te lossen. Geef het gewoon het volledige pad door naar de map waarin u naar png-bestanden wilt zoeken.

fixpng "/path/to/png/folder"

Het script:

#!/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"

Antwoord 9, autoriteit 2%

wat achtergrondinformatie hierover:

Sommige wijzigingen in libpng versie 1.6+ zorgen ervoor dat het een waarschuwing geeft of
zelfs niet correct werken met het originele HP/MS sRGB-profiel, leidend
naar de volgende stderr: libpng-waarschuwing: iCCP: bekende onjuiste sRGB
profiel Het oude profiel gebruikt een D50 witpunt, waar D65 standaard is.
Dit profiel is niet ongebruikelijk en wordt gebruikt door Adobe Photoshop, hoewel
het was standaard niet ingesloten in afbeeldingen.

(bron: https://wiki.archlinux.org/index.php/Libpng_errors)

Foutdetectie in sommige chunks is verbeterd; in het bijzonder de iCCP
chunk reader doet nu een behoorlijk volledige validatie van het basisformaat.
Sommige slechte profielen die eerder werden geaccepteerd, worden nu afgewezen, in
met name het zeer oude kapotte Microsoft/HP sRGB-profiel. De PNG-specificatie
vereiste dat alleen grijswaardenprofielen mogen verschijnen in afbeeldingen met
kleurtype 0 of 4 en dat zelfs als de afbeelding alleen grijs bevat
pixels, mogen alleen RGB-profielen verschijnen in afbeeldingen met kleurtype 2, 3,
of 6, wordt nu afgedwongen. Het sRGB-blok mag in afbeeldingen verschijnen
met elk kleurtype.

(bron: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16)


Antwoord 10, autoriteit 2%

Met de IrfanView-afbeeldingsviewer in Windows heb ik de PNG-afbeelding gewoon opnieuw opgeslagen en daarmee is het probleem verholpen.


Antwoord 11

Verleng de friederbluemle-oplossing, download de pngcrushen gebruik de code als dit uitvoeren op meerdere png-bestanden

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)

hier staan alle png-bestanden met betrekking tot projecten in 1 map.


Antwoord 12

Sommige van de voorgestelde antwoorden gebruiken pngcrushmet de optie -rem allb, waarvan de documentatie zegt dat het lijkt op “chirurgie met een kettingzaag”. De optie verwijdert veel chunks. Om de waarschuwing “iCCP: bekend onjuist sRGB-profiel”te voorkomen, volstaat het om de iCCP-chunk als volgt te verwijderen:

pngcrush -ow -rem iCCP filename.png

Antwoord 13

Ik heb die twee commando’s in de hoofdmap van het project uitgevoerd en het is opgelost.

De uitvoer van de opdracht “find” omleiden naar een tekstbestand dat u kunt gebruiken als uw lijst met te verwerken bestanden. Vervolgens kunt u dat tekstbestand in “mogrify” lezen met de vlag “@”:

vind *.png -mtime -1 > lijst.txt

mogrify -resize 50% @list.txt

Dat zou “find” gebruiken om alle *.png-afbeeldingen nieuwer dan 1 dag te krijgen en ze af te drukken naar een bestand met de naam “list.txt”. Vervolgens leest “mogrify” die lijst, verwerkt de afbeeldingen en overschrijft de originelen met de gewijzigde versies. Er kunnen kleine verschillen zijn in het gedrag van “vinden” van het ene systeem naar het andere, dus u zult de man-pagina moeten controleren voor het exacte gebruik.


Antwoord 14

Hier is een belachelijk brute force-antwoord:

Ik heb het gradlew-script aangepast. Hier is mijn nieuwe exec-opdracht aan het einde van het bestand in de

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**

Other episodes