Skip to content

Commit a22697f

Browse files
committed
Немного другая модель цепочки вызовов
1 parent 820a219 commit a22697f

File tree

3 files changed

+43
-25
lines changed

3 files changed

+43
-25
lines changed

examples/resize/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ <h2>Масштабирование изображения</h2>
5151
</tr>
5252
</table>
5353

54-
<img alt="" id="display" />
54+
<img src="" alt="" id="display" />
5555
</body>
5656

5757
<script>

src/Image.php

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public function __clone()
8383

8484

8585
/**
86-
* Уничожает изображение, в том числе уничтожает его ресурс.
86+
* Уничтожает изображение, в том числе уничтожает его ресурс.
8787
*/
8888
public function __destruct()
8989
{
@@ -138,7 +138,7 @@ public function getRecommendedExtension( $includeDot = false )
138138

139139

140140
/**
141-
* Изменяет размер изображения.
141+
* Изменяет размер изображения. Создаётся копия, текущий объект не модифицируется.
142142
*
143143
* @param int|null $width Желаемая ширина изображения. Если null, то будет рассчитана из высоты с сохранением
144144
* пропорций. Нужно обязательно указать ширину и/или высоту.
@@ -154,7 +154,7 @@ public function getRecommendedExtension( $includeDot = false )
154154
* @param float $alignVer Положение изображения по вертикали при обрезке (от 0 (виден верхний край) до 1 (виден
155155
* нижний край)). Влияет только если указаны ширина и высота и значение и значение аргумента $sizing равно
156156
* Image::SIZING_COVER.
157-
* @return static Сам себя
157+
* @return static Изображение с изменённым размером
158158
* @throws \Exception Если не удалось изменить размер
159159
*
160160
* @see Image::SIZING_CONTAIN
@@ -216,19 +216,18 @@ function resize(
216216
$params[ 'dstWidth' ], $params[ 'dstHeight' ],
217217
$params[ 'srcWidth' ], $params[ 'srcHeight' ] );
218218
imagealphablending( $bitmap, true );
219-
imagedestroy( $this->bitmap );
220219

221220
if ( !$result )
222221
throw new \Exception( 'Не удалось изменить размер изображения по неизвестной причине.' );
223222

224-
$this->bitmap = $bitmap;
225-
226-
return $this;
223+
$newImage = static::construct( $bitmap );
224+
$newImage->isTransparent = $this->isTransparent;
225+
return $newImage;
227226
}
228227

229228

230229
/**
231-
* Пишет текст на изображении.
230+
* Пишет текст на изображении. Создаётся копия, текущий объект не модифицируется.
232231
*
233232
* @param string $text Текст, который нужно написать
234233
* @param string $font Путь к файлу шрифта, которым нужно сделать надпись, на сервере
@@ -241,7 +240,7 @@ function resize(
241240
* @param float $alignVer Положение текста по вертикали (от 0 (снизу от указанной точки) до 1 (сверху от указанной
242241
* точки))
243242
* @param float $angle Угол поворота текста в градусах (против часовой стрелки)
244-
* @return static Сам себя
243+
* @return static Изображение с надписью
245244
* @throws \Exception Если не удалось поместить текст
246245
*/
247246
function write(
@@ -261,16 +260,19 @@ function write(
261260
$x -= $width * $alignHor;
262261
$y -= $height * $alignVer;
263262
$color = static::allocateColor( $this->bitmap, $color );
263+
$bitmap = $this->toResource();
264264

265-
if ( !imagettftext( $this->bitmap, $fontSize, $angle, $x, $y, $color, $font, $text ) )
265+
if ( !imagettftext( $bitmap, $fontSize, $angle, $x, $y, $color, $font, $text ) )
266266
throw new \Exception( 'Не поместить текст на изображении по неизвестной причине.' );
267267

268-
return $this;
268+
$newImage = static::construct( $bitmap );
269+
$newImage->isTransparent = $this->isTransparent;
270+
return $newImage;
269271
}
270272

271273

272274
/**
273-
* Вставляет указанное изображение в текущее.
275+
* Вставляет указанное изображение в текущее. Создаётся копия, текущий объект не модифицируется.
274276
*
275277
* @param self $image Вставляемое изображение
276278
* @param int $dstX Координата X на текущем изображении, куда вставить новое. По умолчанию, 0.
@@ -281,7 +283,7 @@ function write(
281283
* @param int|null $dstHeight Новая Высота вставляемой области. Если null, то не меняется.
282284
* @param int|null $srcWidth Ширина вставляемой области вставляемого изображения. Если null, то вся ширина изображения.
283285
* @param int|null $srcHeight Высота вставляемой области вставляемого изображения. Если null, то вся высота изображения.
284-
* @return static Сам себя
286+
* @return static Текущее изображение с вставленным
285287
* @throws \Exception Если не удалось вставить изображение
286288
*/
287289
function insertImage(
@@ -307,8 +309,10 @@ function insertImage(
307309
if( !is_numeric( $dstWidth ) ) $dstWidth = $srcWidth;
308310
if( !is_numeric( $dstHeight ) ) $dstHeight = $srcHeight;
309311

312+
$bitmap = $this->toResource();
313+
310314
$result = imagecopyresampled(
311-
$this->bitmap,
315+
$bitmap,
312316
$image->bitmap,
313317
$dstX, $dstY,
314318
$srcX, $srcY,
@@ -319,17 +323,19 @@ function insertImage(
319323
if ( !$result )
320324
throw new \Exception( 'Не удалось вставить изображение по неизвестной причине.' );
321325

322-
return $this;
326+
$newImage = static::construct( $bitmap );
327+
$newImage->isTransparent = $this->isTransparent;
328+
return $newImage;
323329
}
324330

325331

326332
/**
327-
* Вращает изображение.
333+
* Вращает изображение. Создаётся копия, текущий объект не модифицируется.
328334
*
329335
* @param float $angle Угол, выраженный в градусах, против часовой стрелки
330336
* @param int[]|null $color Цвет фона (массив с индексами r, g, b и по желанию a). Фон появляется, если изображение
331337
* повёрнуто на угол, не кратный 90°.
332-
* @return static Сам себя
338+
* @return static Повёрнутое изображение
333339
* @throws \Exception Если не удалось повернуть изображение
334340
*/
335341
function rotate( $angle, Array $underlay = null )
@@ -339,10 +345,9 @@ function rotate( $angle, Array $underlay = null )
339345
if ( !$bitmap )
340346
throw new \Exception( 'Не удалось повернуть изображение по неизвестной причине.' );
341347

342-
imagedestroy( $this->bitmap );
343-
$this->bitmap = $bitmap;
344-
345-
return $this;
348+
$newImage = static::construct( $bitmap );
349+
$newImage->isTransparent = $this->isTransparent;
350+
return $newImage;
346351
}
347352

348353

@@ -643,6 +648,19 @@ public static function allocateColor( $bitmap, Array $color = null )
643648
}
644649

645650

651+
/**
652+
* Создаёт объект своего класса. Нужен для возможности безопасного изменения аргументов конструктора в дочерних
653+
* классах.
654+
*
655+
* @see Image::__constructor
656+
* @return static
657+
*/
658+
protected static function construct( $bitmap )
659+
{
660+
return new static( $bitmap );
661+
}
662+
663+
646664
/**
647665
* Рассчитывает параметры масштабирования изображения.
648666
*

src/ImageFactory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ function_exists( 'exif_read_data' ) &&
9797
isset( $exif[ 'IFD0' ][ 'Orientation' ] )
9898
) {
9999
switch( $exif[ 'IFD0' ][ 'Orientation' ] ) {
100-
case 8: $image->rotate( 90 ); break;
101-
case 3: $image->rotate( 180 ); break;
102-
case 6: $image->rotate( -90 ); break;
100+
case 8: $image = $image->rotate( 90 ); break;
101+
case 3: $image = $image->rotate( 180 ); break;
102+
case 6: $image = $image->rotate( -90 ); break;
103103
}
104104
}
105105

0 commit comments

Comments
 (0)