Avatar billede pvtsommer Nybegynder
20. september 2005 - 22:44 Der er 11 kommentarer og
2 løsninger

Spejlvending af billede?

Hey alle,

Jeg står og vil gerne have spejlvendt et billede med PHP. Dvs. jeg har mit source billede (mand.png), som jeg loader ind i et åbent billede.

$picture er naturligvis det billede jeg er i gang med at generere.

$mand = imagecreatefrompng("mand.png");
imagecopy($picture, $mand , 50, 10, 0, 0, 170, 170);

Idéen er at den mand der loades ses fra siden, og dermed kigger imod højre, og peger mod højre. Jeg vil så gerne have en funktion, som automatisk vender ham om - så jeg altså kun skal have mand.png på serveren i stedet for både en mand-hoejre.png og en mand-venstre.png

Da jeg umiddelbart ikke kunne finde en funktion til det her, synes jeg det virker ret svært. Derfor 150 point til den der kan svare på spørgsmålet.

Billedet skal genereres on the run og bliver ikke gemt, så koden må derfor gerne være hurtig :)

På forhånd tak...!
Avatar billede coderdk Praktikant
20. september 2005 - 22:56 #1
Kig på Borszczuk's kommentar fra 05-Jan-2005 04:30 her: http://dk2.php.net/imagecopy
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:00 #2
Det ser meget fint ud! Jeg forsøger mig lidt. Drop lige et svar, så jeg kan acceptere hvis det virker :P
Avatar billede coderdk Praktikant
20. september 2005 - 23:11 #3
Ok, men tag nogle af pointene selv :)
Der er et par forskellige implementationer på den side...
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:14 #4
Duff... Nyt problem..

Det script du fandt virker såmend ganske fint, men.. :( - Det tager ikke højdre for "gennemsigtighed". Dvs min .png filer, bliver gennemsigtige.

Har du en løsning på det? :S
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:17 #5
Jeg så lige at man kan give den en sindsyg baggrundsfarve (fx standard pink agtig) for derefter at allokere den som gennemsigtig med imagecolortransparent().

Vil dog helst undgå dette. :)
Avatar billede coderdk Praktikant
20. september 2005 - 23:20 #6
Skal du ikke bare bruge imagealphablending() (kan ikke huske om det er på source eller destination billedet)...
Avatar billede coderdk Praktikant
20. september 2005 - 23:32 #7
Denne kode virker for mig:

    $imgsrc = imagecreatefrompng( 'eksempel.png' );
    $width = imagesx( $imgsrc );
    $height = imagesy( $imgsrc );
    $imgdest = imagecreatetruecolor( $width, $height );
    imagesavealpha( $imgdest, true );
    imagealphablending( $imgdest, false );
    for ( $x = 0; $x < $width; $x++ )
    {
        for ( $y = 0; $y < $height; $y++ )
        {
            imagecopy( $imgdest, $imgsrc, $width-$x-1, $y, $x, $y, 1, 1 );
        }
    }
    imagepng( $imgdest, 'nytbillede.png' );
    imagedestroy( $imgsrc );
    imagedestroy( $imgdest );
Avatar billede coderdk Praktikant
20. september 2005 - 23:32 #8
Hov, jeg kom til at smide et svar til :P
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:35 #9
Så! Tusinde tak...

Under
  $imgdest = imagecreatetruecolor($width, $height);
i ImageFlip() funktionen fra PHP.net... tilføjede jeg følgende:

    ImageAlphaBlending($imgdest, false);

Med blending slået til gik det helt galt... Og det forstår jeg ærligt ikke :) - Men det virker nu! Ganske perfekt, så det er super...

Tror lige jeg smider den op, da det gavner den funktion utroligt meget.

Jeg overvejede at tilføje imagesavealpha(), da det tilsyneladende skulle fungerer perfekt, såfremt at browseren ikke understøtter transparente billeder, men har ikke gjort det da det spejlvendte billede skal tegnes ovenpå et eksisterende billede - og dermed til syvende og sidst slet ikke er transparant i browseren.

1000 tak! Du får alle point, da du har sparet mig for timers arbejde..
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:36 #10
Lige som tilføjelse blev funktionen til syvende og sidst:

  define("IMAGE_FLIP_HORIZONTAL",    1);
  define("IMAGE_FLIP_VERTICAL",    2);
  define("IMAGE_FLIP_BOTH",    3);

function ImageFlip($imgsrc, $type)
{
  $width = imagesx($imgsrc);
  $height = imagesy($imgsrc);

  $imgdest = imagecreatetruecolor($width, $height);
    ImageAlphaBlending($imgdest, false);

  switch( $type )
      {
      // mirror wzgl. osi
      case IMAGE_FLIP_HORIZONTAL:
          for( $y=0 ; $y<$height ; $y++ )
              imagecopy($imgdest, $imgsrc, 0, $height-$y-1, 0, $y, $width, 1);
          break;

      case IMAGE_FLIP_VERTICAL:
          for( $x=0 ; $x<$width ; $x++ )
              imagecopy($imgdest, $imgsrc, $width-$x-1, 0, $x, 0, 1, $height);
          break;

      case IMAGE_FLIP_BOTH:
          for( $x=0 ; $x<$width ; $x++ )
              imagecopy($imgdest, $imgsrc, $width-$x-1, 0, $x, 0, 1, $height);

          $rowBuffer = imagecreatetruecolor($width, 1);
          for( $y=0 ; $y<($height/2) ; $y++ )
              {
              imagecopy($rowBuffer, $imgdest  , 0, 0, 0, $height-$y-1, $width, 1);
              imagecopy($imgdest  , $imgdest  , 0, $height-$y-1, 0, $y, $width, 1);
              imagecopy($imgdest  , $rowBuffer, 0, $y, 0, 0, $width, 1);
              }

          imagedestroy( $rowBuffer );
          break;
      }

  return( $imgdest );
}
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:37 #11
coderdk: Ja, jeg lurede en lignende på imagecopy() siden... Men den anden kan smide dem rundt på alle leder og kanter.. og det er bare perfekt... igen 1000 tak!
Avatar billede coderdk Praktikant
20. september 2005 - 23:43 #12
Takker :)
Avatar billede pvtsommer Nybegynder
20. september 2005 - 23:47 #13
Niksen, det er mig der takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester