PHP/Imagick zwarte lijnen door een SVG, enkel op live server

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Ik vroeg me af of iemand anders hier al tegenaan is gelopen en het heeft weten op te lossen. Ik heb binnen mijn eigen testomgeving Imagick 7.0.7.-34 draaien en op mijn live server draait 6.9.4-10.

Ik genereer een afbeelding uit bestaande afbeeldingen en nu blijkt dat hier een verschil tussen de test en live omgeving is en er zwarte lijnen door mijn afbeelding komen te staan.

Afbeeldingslocatie: https://puu.sh/CfZ61/e83f3a0bc4.png

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    public static function drawGenderSymbol(\Imagick $img, $gender, $caught = true)
    {
        $genderIcon = new \Imagick();
        $genderIcon->setBackgroundColor(new \ImagickPixel('rgba(255, 0, 0, 1.0)'));
        $shadowColor = new \ImagickPixel("#a9a5e5");
        $x = 0;
        $y          = $caught ? 10 : 15;
        $genderSize = $caught ? 35 : 25;

        if($gender == 1)
        {
            $genderIcon->readImage('images/male.png');
            $x = $caught 
                ? $img->getImageWidth() - $genderSize - 10
                : $img->getImageWidth() - $genderSize - 15;
        }
        else
        {
            $genderIcon->readImage('images/female.png');
            $x = $caught ? 15 : 10;
        }
        $genderIcon->resizeimage($genderSize, $genderSize, \Imagick::FILTER_LANCZOS2, 0);  
        
        if(!$caught)
        {          
            $img->setImageVirtualPixelMethod(\Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
            $genderIcon->colorizeimage($shadowColor, 2.0, true);
        }

        $img->compositeImage($genderIcon, \Imagick::COMPOSITE_DEFAULT, $x, $y);
    }


Wat ik al gevonden of geprobeerd heb
- Host gevraagd of er een imagick update kan worden gedraait (nee - had het ook niet verwacht op een shared host)
- SVGs vervangen door png - zelfde eindresultaat.
- ImagickPixel('rgba(255, 0, 0, 1.0)') i.p.v. ImagickPixel('transparent')

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Xthemes.us schreef op dinsdag 11 december 2018 @ 16:39:
Wat ik al gevonden of geprobeerd heb
- Host gevraagd of er een imagick update kan worden gedraait (nee - had het ook niet verwacht op een shared host)
Als de berg niet tot Mohammed komt, zal Mohammed tot de berg gaan
Waarom installeer je bij jou dan niet 6.9.4-10 en test/develop je daar dan mee? Of stap over naar een host die wél meewerkt of doet waar 'ie voor betaald wordt...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Ik zie geen 6.9.4 in de repositories staan en zelf compilen ben ik totaal niet in huis. En de meeste andere hosts zullen ook een oudere versie draaien / of een stuk meer kosten.

Of makkelijker gezegd, beide oplossingen kosten meer moeite dan de boel naar GD2 omzetten die naar verwachting niet dit probleem heeft. Maar ik had de hoop dat iemand wellicht een oplossing weet waar een imagick handeling meer de boel oplost.

[edit]
En het kan zijn dat ik tegen memory limieten aanloop met gd2 want ik meen me te herinneren dat Imagick die omzeilt.

[ Voor 13% gewijzigd door Xthemes.us op 11-12-2018 17:10 ]

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Xthemes.us schreef op dinsdag 11 december 2018 @ 17:09:
Ik zie geen 6.9.4 in de repositories staan en zelf compilen ben ik totaal niet in huis. En de meeste andere hosts zullen ook een oudere versie draaien / of een stuk meer kosten.
Dat was dan wel handig geweest om even in je topicstart te zetten ;)

Heb je al eens geprobeerd om de verschillende operaties (resize, colorize, backgroundcolor wat ik zo even allemaal zie) eens één voor één weg te halen en te kijken of dat 't issue (los van de bewerking zelf natuurlijk) oplost? Beetje creatief debuggen dus?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Net mee bezig geweest, biedt helaas soelaas. Ook verschillende COMPOSITE mode toegepast zonder success. Denk dat ik de boel maar herschrijf naar GD2 en hoop dat ik daar niet tegen problemen aanloop.

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Acties:
  • 0 Henk 'm!

  • Jivebunny
  • Registratie: November 2010
  • Niet online

Jivebunny

Fail to plan. Plan to fail.

code:
1
$genderIcon->resizeimage($genderSize, $genderSize, \Imagick::FILTER_LANCZOS2, 0.1);

Doet dat iets?

Pixel 9 Pro XL | NAS: HP Gen8 e3-1265L v2 16GB 12TB unRAID 6.9.2 | D: Ryzen 5600x 16GB 3000mhz RX 6800 XT MB Acer 27" IPS 144hz | Suzuki Swift 1.2 (2013)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Xthemes.us schreef op dinsdag 11 december 2018 @ 17:42:
Net mee bezig geweest, biedt helaas soelaas.
:? Dat kan haast niet (en ik denk dat je "geen" mist tussen helaas en soelaas :P ). Eén van de operaties in die method moet die lijnen veroorzaken. Anders zitten die lijnen in 't origineel of je hebt nog ergens anders code staan waar je iets met de image doet.

Bouw je drawGenderSymbol functie eens "regel voor regel" opnieuw op en kijk tussendoor wat de resultaten zijn na elke wijziging. Er moet een moment komen waar 't mis gaat; dan weet je in ieder geval welke regel het veroorzaakt en in welke richting je 't moet zoeken.

[ Voor 49% gewijzigd door RobIII op 11-12-2018 18:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Jivebunny schreef op dinsdag 11 december 2018 @ 17:43:
code:
1
$genderIcon->resizeimage($genderSize, $genderSize, \Imagick::FILTER_LANCZOS2, 0.1);

Doet dat iets?
Jazeker, zie de ternary operator bij de $genderSize variable, verkleint de boel als $caught niet true is. (Sinds ik het veranderd heb naar een png van 35 doet het niet altijd wat, maar toen het nog een SVG was moest er sowieso een grootte mee worden gegeven :).
RobIII schreef op dinsdag 11 december 2018 @ 17:50:
[...]

:? Dat kan haast niet (en ik denk dat je "geen" mist tussen helaas en soelaas :P ). Eén van de operaties in die method moet die lijnen veroorzaken. Anders zitten die lijnen in 't origineel of je hebt nog ergens anders code staan waar je iets met de image doet.

Bouw je drawGenderSymbol functie eens "regel voor regel" opnieuw op en kijk tussendoor wat de resultaten zijn na elke wijziging. Er moet een moment komen waar 't mis gaat; dan weet je in ieder geval welke regel het veroorzaakt en in welke richting je 't moet zoeken.
Inderdaad het woordje "geen" vergeten. Ik heb de if caught colorize en resize eruit gecomment en ik krijg alsnog hetzelfde resultaat als het op strepen aankomt. De bron svg en later png hebben geen zwarte lijnen en lokaal is het resultaat ook haarscherp het is enkel op de liveserver waar deze bug zich voordoet. Het lijkt erop dat de bron is ik een basis Imagick object hebt (een chart), daarbovenop zet ik een tweede imagick object, een vierkant of een wazige circel, daarbovenop zet ik een plaatje en bovenop het plaatje zet ik deze genderSymbol(). Ergens tussen al deze lagen lijkt deze oudere Imagick versie de weg kwijt te raken en voegt die zwarte strepen toe.

Ook geprobeerd de manier van het bestand inladen aan te passen zonder success
code:
1
2
3
4
            $fhGender = fopen('images/male.png', 'r');
            $genderIcon = new \Imagick();
            $genderIcon->readimagefile($fhGender);
            fclose($fhGender);

[ Voor 7% gewijzigd door Xthemes.us op 11-12-2018 19:27 ]

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Acties:
  • 0 Henk 'm!

  • Jivebunny
  • Registratie: November 2010
  • Niet online

Jivebunny

Fail to plan. Plan to fail.

Ging mij om de 0, die had ik op 0.1 gezet. Las ergens dat er mensen waren met zwarte strepen door sharpness/blurry settings bij resizen, maar niet altijd met de lanczos filter.

[ Voor 10% gewijzigd door Jivebunny op 11-12-2018 19:38 ]

Pixel 9 Pro XL | NAS: HP Gen8 e3-1265L v2 16GB 12TB unRAID 6.9.2 | D: Ryzen 5600x 16GB 3000mhz RX 6800 XT MB Acer 27" IPS 144hz | Suzuki Swift 1.2 (2013)


Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Ah nu snap ik hem. Is hem helaas niet ik had er een if omheen gezet zodat hij niet meer werd uitgevoerd als het niet nodig was (nu dat de .png toch al 35px is) maar in beide gevallen kreeg ik alsnog zwarte strepen. Ondertussen al een flink stuk onderweg om het merendeel m.b.v. GD2 te doen - alhoewel ik alsnog Imagick blijf gebruiken om elders een afgeronde vierkant te tekenen.

Moet nog wel even uitzoeken hoe ik hetzelfde effect met colorize uitvoer ik had al wel "imagefilter($img, IMG_FILTER_COLORIZE" gevonden maar de parameters zijn anders.

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Acties:
  • +1 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Xthemes.us schreef op dinsdag 11 december 2018 @ 19:22:
[...]
Ik heb de if caught colorize en resize eruit gecomment en ik krijg alsnog hetzelfde resultaat als het op strepen aankomt.
Ok, dus je hebt 2 bewerkingen uitgecomment en je krijgt hetzelfde resultaat.
- Het lijkt erop dat de bron is ik een basis Imagick object hebt (een chart),
- daarbovenop zet ik een tweede imagick object,
- een vierkant of een wazige circel,
- daarbovenop zet ik een plaatje en
- bovenop het plaatje zet ik deze genderSymbol(). Ergens tussen al deze lagen lijkt deze oudere Imagick versie de weg kwijt te raken en voegt die zwarte strepen toe.
Waarom zie ik alleen hier al 5 bewerkingen staan terwijl je er maar 2 uitcomment (en die 2 zitten hier nog niet eens tussen)

Pak het gewoon eens rustig 1 voor 1 aan en bouw gewoon je bestand eens vanaf stap 1 opnieuw op. En je ziet het vanzelf ergens fout gaan.

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 22:43
Werkt dit?

$img->compositeImage($genderIcon, \Imagick::COMPOSITE_DEFAULT, $x, $y, Imagick::CHANNEL_ALPHA);

of

$img->compositeImage($genderIcon, \Imagick::COMPOSITE_OVER, $x, $y);

Beetje spelen met die twee zaken. Ben niet precies bekend met Imagick (werk meestal gewoon direct met imagemagick, vaak wat makkelijker), maar het lijkt erop dat de transparency niet wordt meegenomen.

Wel heel lelijk om pixel icons te scalen trouwens. Kan je beter een SVG gebruiken.

[ Voor 70% gewijzigd door BarôZZa op 13-12-2018 14:19 ]

Pagina: 1