이번에 PHP로 프로젝트 하면서 서버로 이미지를 수정해야 하는 상황이 왔는데, 여러 방법으로 이미지를 수정해보았다.
먼저, PDF 파일을 JPG로 변환하기 위해 imagick 라이브러리를 사용했다.
imagick는 이미지 처리에 필요한 모듈인데, 따로 설치가 필요하다.
[imagick 확장 모듈 설치]
1. 패키지 설치
yum install ImageMagick ImageMagic-devel
2. imagick 다운로드
- 최신버전 다운로드 사이트 : http://pecl.php.net/package-stats.php
wget http://pecl.php.net/get/imagick-3.1.2.tgz
3. 압축 풀기
tar zxvf imagick-3.1.2.tar.gz
4. 설치
cd imagick-3.1.2
/usr/local/php54/bin/phpize
./configure --with-php-config=/usr/local/php54/bin/php-config
make && make install
(phpize 및 php-config는 php 설치 경로에 맞게 하면 된다.)
5. php.ini 수정
vim php.ini
;; imagick
extension = imagick.so
(해당 extension_dir 경로 확인 후 그쪽에 imagick.so 카피 후 extension 설정하면 된다.)
[PDF -> JPG 변환]
imagick 설치가 완료되면, 아래 소스를 이용하여 PDF 파일을 JPG로 변환해준다.
$images = new Imagick("/img/test.pdf");
foreach($images as $i=>$image) {
$image->setResolution(300,300);
$image->writeImage("/img/test".$i.".jpg");
}
1. 변환할 PDF 페이지 지정
$pdf->getNumberOfPages(); //returns an int
$pdf->setPage(2)
->saveImage($pathToWhereImageShouldBeStored); //saves the second page
2. 저장될 이미지의 포맷 설정
$pdf->setOutputFormat('png')
->saveImage($pathToWhereImageShouldBeStored); //the output wil be a png, no matter what
3. 저장될 이미지의 해상도 설정
$pdf->setCompressionQuality(100); // sets the compression quality to maximum
해상도는 최대 100까지 설정할 수 있으며, 해상도가 높을수록 이미지 변환 속도는 느려진다.
4. 저장될 이미지의 크기 설정
$pdf
->width(400)
->saveImage($pathToWhereImageShouldBeStored);
5. 이미지 배경 하얗게 설정
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); # 혹은 $im->setImageAlphaChannel(11);
$im = $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
PDF->JPG로 변환했을 시, 변환된 이미지 배경이 까맣게 나오는 경우가 있었는데, 위 소스를 추가하여 해결하였다.
[JPG -> base64 변환]
이번에는 이미지 위에 텍스트를 넣기 위해, 이미지 파일을 base64로 인코딩한 텍스트 문자로 img 태그에 적용하였다.
<img src="data:image/gif;base64, ...>
<?php
$data = base64_encode(file_get_contents("test.jpg"));
echo "<img src='data:image/gif;base64, $data'>";
?>
base64로 인코딩은 위 소스를 이용하여 변환하였다.
이렇게 img 태그에 base64로 인코딩한 텍스트를 넣어주고, 그 아래 td 태그를 이용하여 텍스트를 입력하면 원하는 이미지 위에 텍스트를 뿌려줄 수 있다.
[PDF 병합]
$ gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...
[JPG 병합]
$ convert +append image1.png image2.png out.png # 가로로 붙이기
$ convert -append image1.png image2.png out.png # 세로로 붙이기
$ convert +append -geometry 240x a.png b.png output.png # 크기 변환
PHP에서 exec를 통해 위 소스를 실행시켜 병합해주면 된다.
* PHP exec 란?
Reference
https://wnstjqdl.tistory.com/entry/php-imagick-%ED%99%95%EC%9E%A5-%EB%AA%A8%EB%93%88-%EC%84%A4%EC%B9%98
https://github.com/spatie/pdf-to-image
https://www.habonyphp.com/2020/07/php-base64_27.html
http://blog.genoglobe.com/2020/01/blog-post.html
'Programming > php' 카테고리의 다른 글
[php] ZipArchive 사용한 다중 파일 압축하기 (0) | 2023.05.24 |
---|