[php]resizen werkt lelijk

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik heb een scriptje:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
  mysql_query("INSERT INTO pictures VALUES('','$ext','".$_POST["id"]."')");
  $uploadfile = "/var/www/html/pic/pic".mysql_insert_id().".".$ext;
  if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
    chmod($uploadfile,0644);
    $size=getimagesize($uploadfile);
    if($size[0]>500){
      
      $percent=$size[0]/500;
      $newwidth = $size[0] / $percent;
      $newheight = $size[1] / $percent;
      $newimage = imagecreate($newwidth, $newheight);
      $source = imagecreatefromjpeg($uploadfile);
      imagecopyresampled($newimage, $source, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]);
      imagejpeg($newimage,$uploadfile,100);
    };



Maar ik krijg er oerlelijke plaatjes uit met imagecopyresampled.. Met imageCopyResampleBicubic krijg ik er zwarte plaatjes uit.

Ik quote van de PHP site:
Note: There is a problem due to palette image limitations (255+1 colors). Resampling or filtering an image commonly needs more colors than 255, a kind of approximation is used to calculate the new resampled pixel and its color. With a palette image we try to allocate a new color, if that failed, we choose the closest (in theory) computed color. This is not always the closest visual color. That may produce a weird result, like blank (or visually blank) images. To skip this problem, please use a truecolor image as a destination image, such as one created by imagecreatetruecolor().
Maar ik snap niet hoe ik dit kan gebruiken als ik jpeg bestanden wil bewerken...

[ Voor 30% gewijzigd door Megamind op 14-11-2004 20:33 ]


Acties:
  • 0 Henk 'm!

  • sirdupre
  • Registratie: Maart 2002
  • Laatst online: 27-04 09:36
misschien door
code:
1
   $newimage = imagecreate($newwidth, $newheight);

te vervangen door
code:
1
   $newimage = imagecreatetruecolor($newwidth, $newheight);

.
Als dit werkt zou het heel suf zijn, want ik verzin dit puur uit jouw openingspost... heb er verder niks op na geslagen.

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Weet je.. als je al een uur op hetzelfde stukje code zit te staren en onmogelijke combinaties aan het maken bent en dan hulpeloos op het got om antwoord vraagt, en dan zo'n antwoord krijgen voel je je toch wel heeeeel klein O+

Acties:
  • 0 Henk 'm!

  • sirdupre
  • Registratie: Maart 2002
  • Laatst online: 27-04 09:36
Is dat zo'n geval van "chemisch wakker betekent niet altijd dat je even scherp bent?" ;).

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Met deze functie kun je ook nog imagecopyresampled() vervangen, het worden zo hele mooie plaatjes.

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
32
33
34
        function ImageCopyResampleBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
        {
                /*
                 * Port to PHP by John Jensen July 10 2001 -- original code
                 * (in C, for the PHP GD Module) by jernberg@fairytale.se
                 */
                for ($i = 0; $i < 256; $i++)
                {
                        // get pallete. Is this algoritm correct?
                        $colors = ImageColorsForIndex ($src_img, $i);
                        ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']);
                }
                $scaleX = ($src_w - 1) / $dst_w;
                $scaleY = ($src_h - 1) / $dst_h;
                $scaleX2 = $scaleX / 2.0;
                $scaleY2 = $scaleY / 2.0;
                for ($j = $src_y; $j < $dst_h; $j++)
                {
                        $sY = $j * $scaleY;
                        for ($i = $src_x; $i < $dst_w; $i++)
                        {
                                $sX = $i * $scaleX;
                                $c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
                                $c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
                                $c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
                                $c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));
                                $red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
                                $green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
                                $blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);
                                $color = ImageColorClosest ($dst_img, $red, $green, $blue);
                                ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color);
                        }
                }
        }