[PHP] ImageRotate & Alpha gaan niet samen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bart B
  • Registratie: Juli 2000
  • Laatst online: 05-01 16:29
Hallo allemaal,

Sinds enige tijd ben ik met een redelijk omvangrijk script bezig, waarmee een aantal standaard bewerkingen (voornamelijk te gebruiken bij een fotogallery) wordt vermakkelijkt. Ik post het hele script niet, dat is 1000 regels groot en voornamelijk irrelevant.

Ik ben nu bezig met het implementeren van de volledige support van het alpha kanaal. Daatbij stuit ik op een probleem.

Ik heb een functie geschreven om een plaatje te mirroren. De belangrijke code ($this->m_img is het originele plaatje):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$width = ImageSX($this->m_img);
$height = ImageSY($this->m_img);
$new_img = ImageCreateTrueColor($width,$height);

ImageAlphaBlending($new_img,false);
        
for($i=0;$i<$height;$i++)
{
    ImageCopy($new_img,$this->m_img,
        0,($height-$i-1),
        0,$i,
        $width,1);
}

ImageAlphaBlending($new_img,true);
ImageDestroy($this->m_img);     
$this->m_img = $new_img;


Wat ik hier doe:
1) ik maak een nieuw plaatje
2) ik zet een nieuwe alpha blending mode
3) kopieer de strookjes
4) zet alpha blending mode terug.

De reden dat ik alpha blending mode verander is simpel. Zou ik dat niet doen, en ik zou een transparant plaatje kopieren, dan krijg ik de originele kleur van het target terug ( immers: wit + transparant = wit). Met het veranderen van de mode krijg ik het voormekaar dat er wordt overschreven.


HET PROBLEEM
Ik heb ook een functie die roteerd. Deze is:

PHP:
1
2
3
$img_new = imagerotate($this->m_img,$rotate_deg,$bg_color);
ImageDestroy($this->m_img);
$this->m_img = $img_new;

Het probleem is, dat image rotate de standaard blending mode gebruikt (degene die ik wil gebruiken), en dat ik niet in staat ben deze te veranderen. Op alle plekken die transparant zijn, krijg ik zwarte pixels (ook als ik heb aangegeven dat ik extra ruimte veroorzaakt door roteren wit wil hebben).

VRAAG
Hoe kan ik er voor zorgen dat imagerotate de juiste alpha blending mode gebruikt, en toch de doorzichtige stukken doorzichtig laat.

[ Voor 7% gewijzigd door Bart B op 04-12-2003 00:02 ]


Acties:
  • 0 Henk 'm!

  • -=bas=-
  • Registratie: Oktober 2000
  • Laatst online: 22-04 02:56
Zelf schrijven is een stuk trager omdat het geinterpreteerd moet worden in tegenstelling tot de interne PHP functies die eigenlijk al van te voren zijn gecompileerd op de server. Maar als het om kleine plaatjes gaat dan is het best te doen. Er zijn hele slimme truuks om te scalen/roteren maar daarvoor kan je het best even wat game-programming websites raadplegen.

Heeft GD geen aardige oplossingen voor je probleem? Of loop je tegen een probleem in GD aan (dat gebeurt al snel naar verluid)?

Senile! Senile Oekaki


Acties:
  • 0 Henk 'm!

Verwijderd

_bas_ schreef op 03 december 2003 @ 23:56:

Heeft GD geen aardige oplossingen voor je probleem? Of loop je tegen een probleem in GD aan (dat gebeurt al snel naar verluid)?
Zoals de beste TS zegt;
[message]de TS zegt ... :[/message]

Het probleem is, dat image rotate de standaard blending mode gebruikt (degene die ik wil gebruiken), en dat ik niet in staat ben deze te veranderen.

Acties:
  • 0 Henk 'm!

  • Bart B
  • Registratie: Juli 2000
  • Laatst online: 05-01 16:29
Ik heb inmiddels opgegeven om dit probleem op te lossen met TrueColor Plaatjes. Mogelijk dat ik het later doe met palette images, maar dat weet ik niet zeker.

Acties:
  • 0 Henk 'm!

  • Tycoontje
  • Registratie: Februari 2003
  • Laatst online: 15-07 12:59
Jammer. Ik zat dit topic in de gaten te houden, want ik ben erg benieuwd naar de oplossing. Ik ben zelf ook bezig om een fotogallery te bouwen. Nou ben ik nog niet tegen zulke problemen aangelopen. Voor alsnog gebruik ik geen imagerotate(), omdat die pas vanaf 4.3.0 beschikbaar is en ik het compatible wil houden op 4. Maar ik vind het wel interessant om te weten wat er allemaal mogelijk is met de image functies en ik wil ook graag weten welke bugs er in zitten (net als bijvoorbeeld de workaround die voor imagecopyresampled() nodig is).

Ik moet zeggen dat ik het probleem niet helemaal snap. Gebruik je deze 2 stukjes code na elkaar en werkt het daarom niet? Of gebruik je in de volledige versie imagealphablending() ook in het 2e stukje?

Krijg je die zwarte pixels ook als je het 1e stuk code weglaat? Want dan zou het puur om die functie gaan. Ik vroeg me namelijk af of imagecolortransparent() geen oplossing kan bieden.

offtopic:
Is dat DE manier om een plaatje te mirror'en? Is dat niet vreselijk traag?

Acties:
  • 0 Henk 'm!

  • Bart B
  • Registratie: Juli 2000
  • Laatst online: 05-01 16:29
Tycoontje... neem ff contact met me op via ICQ, MSN, Jabber of email (zie profiel). Misschien wel leuk om over imagegallery te praten ( ik ben er redelijk ver mee ). Ik ben zowiezo van plan meer mensen aan te trekken om iets moois hiervan te maken. Ik zou jou wel willen contacten, maar je profiel is helemaal leeg

[ Voor 14% gewijzigd door Bart B op 05-12-2003 14:34 ]


Acties:
  • 0 Henk 'm!

  • Tycoontje
  • Registratie: Februari 2003
  • Laatst online: 15-07 12:59
Kan dit ook op MSN zeggen natuurlijk, maar ik dacht.. laat ik het topic verder aanvullen.. misschien heeft iemand er ooit nog wat aan.

Ik kwam dit tegen:
http://bugs.php.net/bug.php?id=23792

Zou het kunnen dat dat er mee te maken heeft?
Pagina: 1