> php教程 > php手册 > PHP下使用强大的imagick轻松生成组合缩略图,imagick缩略图

PHP下使用强大的imagick轻松生成组合缩略图,imagick缩略图

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-13 08:46:06
원래의
815명이 탐색했습니다.

PHP下使用强大的imagick轻松生成组合缩略图,imagick缩略图

1

2

3

4

5

6

7

8

9

10

11

<code class="language-meta">project: blog

target: use-imagick-to-composite-images-thumbnail.md

date: 2016-02-19

status: publish

tags:

    - php

    - imagick

    - thumbnail

categories:

    - php

</code>

로그인 후 복사

这里说的imagickImageMagick 在PHP下的扩展。使用pecl安装起来那叫一个轻松简单 —— 一条命令就搞定:

1

2

<code class="language-sh">sudo pecl install imagick

</code>

로그인 후 복사

(扩展装好后还是要在php.ini中加上extension=imagick.so,然后记得重启apachephp-fpm服务。)

最近有个需求是要把多张图片组合起来生成缩略图,刚好用用这个强大的imagick扩展。
这个需求是要这样生成缩略图:

这规则还真不少,不过还不算太过复杂,很快搞出来了:

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

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

<code class="language-php">namespace \clarence\thumbnail;

class Thumbnail extends \Imagick

{

    /**

     * @param array $images

     * @param int $width

     * @param int $height

     * @return static

     * @throws ThumbnailException

     */

    public static function createFromImages($images, $width, $height){

        if (empty($images)){

            throw new ThumbnailException("No images!");

        }

 

        $thumbnail = new static();

        $thumbnail->newImage($width, $height, &#39;white&#39;, &#39;jpg&#39;);

        $thumbnail->compositeImages($images);

 

        return $thumbnail;

    }

 

    public function compositeImages($images){

        $imagesKeys = array_keys($images);

        $compositeConfig = $this->calcCompositeImagesPosAndSize($images);

 

        foreach ($compositeConfig as $index => $cfg){

            $imgKey = $imagesKeys[$index];

            $img = new \Imagick($images[$imgKey]);

            $img = $this->makeCompositeThumbnail($img, $cfg);

            $this->compositeImage($img, self::COMPOSITE_OVER, $cfg[&#39;to&#39;][&#39;x&#39;], $cfg[&#39;to&#39;][&#39;y&#39;]);

        }

    }

 

    protected function makeCompositeThumbnail(\Imagick $img, $cfg){

        $img->cropThumbnailImage($cfg[&#39;size&#39;][&#39;width&#39;], $cfg[&#39;size&#39;][&#39;height&#39;]);

        return $img;

    }

 

    protected function calcCompositeImagesPosAndSize($images){

        $width = $this->getImageWidth();

        $height = $this->getImageHeight();

 

        switch(count($images)){

            case 0:

                throw new ThumbnailException("No images!");

            case 1:

                // | 0 |

                return [

                    0 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => 0 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width,

                            &#39;height&#39; => $height,

                        ]

                    ]

                ];

            case 2:

                // | 0 | 1 |

                return [

                    0 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => 0 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height,

                        ]

                    ],

                    1 => [

                        &#39;to&#39; => [ &#39;x&#39; => $width / 2, &#39;y&#39; => 0],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height,

                        ]

                    ]

                ];

            case 3:

                // | 0 | 1 |

                // | 2 |   |

                return [

                    0 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => 0 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                    1 => [

                        &#39;to&#39; => [ &#39;x&#39; => $width / 2, &#39;y&#39; => 0],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height,

                        ]

                    ],

                    2 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => $height / 2 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                ];

            default:

                // >= 4:

                // | 0 | 1 |

                // | 2 | 3 |

                return [

                    0 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => 0 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                    1 => [

                        &#39;to&#39; => [ &#39;x&#39; => $width / 2, &#39;y&#39; => 0],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                    2 => [

                        &#39;to&#39; => [ &#39;x&#39; => 0, &#39;y&#39; => $height / 2 ],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                    3 => [

                        &#39;to&#39; => [ &#39;x&#39; => $width / 2, &#39;y&#39; => $height / 2],

                        &#39;size&#39; => [

                            &#39;width&#39; => $width / 2,

                            &#39;height&#39; => $height / 2,

                        ]

                    ],

                ];

        }

    }

}

 

</code>

로그인 후 복사

用个试试:

1

2

3

4

<code class="language-php">$thumbnail = \clarence\thumbnail\Thumbnail::createFromImages($srcImages, 240, 320);

$thumbnail->writeImage($outputDir."/example.jpg");

 

</code>

로그인 후 복사

效果立马出来了:

赞一个~

(详细代码见 http://github.com/clarence-pan/thumbnail)

관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿