Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Imagick cropImage, negatieve waardes

Pagina: 1
Acties:

Onderwerpen


  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Hallo Tweakers,

Ik maak al een geruime tijd gebruik van imageick, Alleen wil ik nu een afbeelding snijden met negatieve waardes.

bijv, $img->cropImage(450, 450, $node['left'], $node['top']);

450 x 450 moet de groote worden van de afbeelding. de nodes left en top is dus de positie. Alles gaat goed totdat ik waardes ga gebruiken die onder de 0 komen, dan word de afbeelding niet 450 bij 450 meer. Maar word de afbeelding kleiner. Is er een manier om alsnog hetgene op te vullen met wit ? Zodat de afbeelding toch 450 x 450 px word ?

Dit is wat ik al gemaakt heb, heb echter totaal geen idee hoe ik dit zou kunnen oplossen.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
    require_once '../core.php';
    
    function filecheck($file){
        return (file_exists($file) && is_file($file) && !is_dir($file));
    }
    function msgError($err){
        echo $err;
        exit();
    }
    
    if(!isset($_SESSION['designer']['img']) && count($_SESSION['designer']['img']) == 0){
        echo 'ERROR, Invalid render settings.';
        exit();
    }
    //$_SESSION['designer']['ready'][$node['product']] = array();
    $iii=0;
    foreach($_SESSION['designer']['img'] as $node){
        
        if(!filecheck('../../'.$node['design'])) msgError('Kan afbeelding niet laden (DESIGN)'.'../../'.$node['design']);
        if(!filecheck('../../'.$node['img_show'])) msgError('Kan afbeelding niet laden (VIEW)'.'../../'.$node['img_show']);
        if(!filecheck('../../'.$node['img_mask'])) msgError('Kan afbeelding niet laden (MASK)'.'../../'.$node['img_mask']);
        
        $img = new Imagick('../../'.$node['design']);
        $msk = new Imagick('../../'.$node['img_mask']);
        
        $img->setImageMatte(1);
        
        if($node['zoom'] != 100){
            $d = $img->getImageGeometry();
            $scaling = array(
                0 => (($d['width'] / 100) * $node['zoom']),
                1 => (($d['height'] / 100) * $node['zoom'])
            );
            $img->scaleImage($scaling[0], $scaling[1]);
        }
        
        $img->cropImage(450, 450, $node['left'], $node['top']);
        
        $img->compositeImage($msk, 4, 0, 0);
        
        do{
            $filename = './designscript/designs/render/'.md5(rand(0,9999999)).'.png';
        } while(file_exists('../../'.$filename));
        
        
        $_SESSION['designer']['ready'][$node['product']][$iii] = $filename;
        
        file_put_contents('../../'.$filename, $img);

        $iii++;
        $img->destroy();
        $msk->destroy(); 
    }
    echo 'OK';
?>

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Oké, eerst het volgende: Imageick bestaat niet. Je bedoelt waarschijnlijk Imagick, een wrapper om het programma ImageMagick.

Met ImageMagick (en dus ook met Imagick) kun je een afbeelding vergroten en het nieuwe (lege) gedeelte wordt vervolgens opgevuld met de achtergrondkleur. Eerst doe je een setBackgroundColor() en daarna extentImage(). Zo uit m'n hoofd zou dat moeten werken.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Dan ben je niet meer aan het croppen maar aan he framen (geen idee of dat de juiste benaming is). In GD is volgens mij je enige optie eerst bijsnijden en dan kopiëren naar een nieuwe, grotere image met de gewenste kleur als achtergrond. Volgens mij is dat in imagemagick niet anders. :)

edit:
Of wat HuHu zegt. De essentie is in elk geval eerst bijsnijden en dan pas de achtergrond bewerkstelligen in een aparte operatie.

[ Voor 19% gewijzigd door NMe op 21-10-2011 12:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.