title: PHP Image quality issue on rotating and merging
body: <p>When i merge two images as one background and the other as target image. I m using pngs. When I rotate the target image and then merge, yes everything is fine except that the edges of rotated image becomes zigzag i means not smooth. How to make the edges smooth using php GD???</p>
  
  <p><img src="https://i.stack.imgur.com/4Azoj.jpg" alt="Normal Image"></p>
  
  <p><img src="https://i.stack.imgur.com/fJYtl.jpg" alt="After Rotation"></p>
  
  <p>The code I am using:</p>
  
  <pre><code>&lt;?php
  
  // Create image instances
  
  $dest = imagecreatefrompng('bg.png');
  $src = imagecreatefrompng('text.png');
  $width = imagesx($src);
  $height = imagesy($src);
  imageantialias($src, true);
  $color = imagecolorallocatealpha($src, 0, 0, 0, 127);
  $rotated = imagerotate($src, 40, $color);
  imagesavealpha($rotated, true);
  
  // $trans_colour = imagecolorallocatealpha($rotated, 0, 0, 0, 127);
  // imagefill($rotated, 0, 0, $trans_colour);
  
  imagepng($rotated, 'shahid.png');
  $new_img = imagecreatefrompng('shahid.png?');
  $width = imagesx($new_img);
  $height = imagesy($new_img);
  
  // imagecopymerge($dest, $new_img, 50, 50, 0, 0, $width+60, $height+60, 100);
  
  imagecopymerge_alpha($dest, $new_img, 0, 20, 0, 0, $width, $height, 100);
  
  // Output and free from memory
  
  header('Content-Type: image/png');
  imagepng($dest);
  imagedestroy($dest);
  imagedestroy($src);
  
  function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
  {
      if (!isset($pct)) {
          return false;
      }
  
      $pct/= 100;
  
      // Get image width and height
  
      $w = imagesx($src_im);
      $h = imagesy($src_im);
  
      // Turn alpha blending off
  
      imagealphablending($src_im, false);
  
      // Find the most opaque pixel in the image (the one with the smallest alpha value)
  
      $minalpha = 127;
      for ($x = 0; $x &lt; $w; $x++)
      for ($y = 0; $y &lt; $h; $y++) {
          $alpha = (imagecolorat($src_im, $x, $y) &gt;&gt; 24) &amp; 0xFF;
          if ($alpha &lt; $minalpha) {
              $minalpha = $alpha;
          }
      }
  
      // loop through image pixels and modify alpha for each
  
      for ($x = 0; $x &lt; $w; $x++) {
          for ($y = 0; $y &lt; $h; $y++) {
  
              // get current alpha value (represents the TANSPARENCY!)
  
              $colorxy = imagecolorat($src_im, $x, $y);
              $alpha = ($colorxy &gt;&gt; 24) &amp; 0xFF;
  
              // calculate new alpha
  
              if ($minalpha !== 127) {
                  $alpha = 127 + 127 * $pct * ($alpha - 127) / (127 - $minalpha);
              }
              else {
                  $alpha+= 127 * $pct;
              }
  
              // get the color index with new alpha
  
              $alphacolorxy = imagecolorallocatealpha($src_im, ($colorxy &gt;&gt; 16) &amp; 0xFF, ($colorxy &gt;&gt; 8) &amp; 0xFF, $colorxy &amp; 0xFF, $alpha);
  
              // set pixel with the new color + opacity
  
              if (!imagesetpixel($src_im, $x, $y, $alphacolorxy)) {
                  return false;
              }
          }
      }
  
      // The image copy
  
      imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
  }
  
  ?&gt;
  </code></pre>