您的位置:首页 > 运维架构 > Linux

Linux下php动态添加扩展(续)

2013-04-23 20:47 337 查看
接上次的php动态添加扩展/article/5244485.html

为了实现在完成扩展的基础上的图片操作...

思路:先将图片流存成图片,然后利用扩展库在本地打开图片再操作完再保存...

1、下载开源库

Jpeg库libJpeg,png库libpng,GD库 gd2 (可能需要freetypezlib)

2、安装库(主要Jpeg库与gd库)

Jpeg库需要自己建目录,安装如下:

mkdir -p /usr/local/jpeg/include
mkdir -p /usr/local/jpeg/lib
mkdir -p /usr/local/jpeg/bin
mkdir -p /usr/local/jpeg/man/man1  
./configure --prefix=/usr/local/jpeg --enable-shared
#make
#make install  

GD库需要指定ljpeg库等地址,如下:

./configure --prefix=/usr/local/gd2 --with-png --with-freetype=/usr/local/freetype --with-jpeg=/usr/local/libjpeg
#make
#make install

重新编译生成PHP,如下:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-zlib --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/png --with-freetype-dir=/usr/local/freetype --enable-ftp --enable-sockets --with-gd=/usr/local/gd2 --enable-gd-native-ttf --with-ttf --enable-magic-quotes --with-iconv -enable-mbstring=all
#make
#make install

3、编译处理图片的php的C扩展库

#include"jpeglib.h"
//打开图片
void loadJPEG(char* path,BYTE** pData,int* nWidth,int* nHeight){
  struct jpeg_decompress_struct cinfo;
  struct jpeg_error_mgr jerr;
  cinfo.err = jpeg_std_error(&jerr);
  jpeg_create_decompress(&cinfo);
  FILE *f = fopen(path,"rb");
  if (f==NULL)
  {
    return;
  }

  jpeg_stdio_src(&cinfo, f);
  jpeg_read_header(&cinfo, TRUE);
  int nCount=cinfo.image_width*cinfo.image_height*cinfo.num_components;
  BYTE* data = (BYTE*)malloc(nCount*sizeof(BYTE));//图片数据
  jpeg_start_decompress(&cinfo);
  JSAMPROW row_pointer[1];
  *nWidth=cinfo.output_width;//图片宽
  *nHeight=cinfo.output_height;//图片高
  while (cinfo.output_scanline < cinfo.output_height)
  {
     row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*cinfo.image_width*cinfo.num_components];
   jpeg_read_scanlines(&cinfo,row_pointer ,1);
  }
  jpeg_finish_decompress(&cinfo);
  jpeg_destroy_decompress(&cinfo);
  fclose(f);
  *pData=data; //图片数据
}
//保存图片
void saveJPEG(char* path,BYTE* pDataConv,int nWidth,int nHeight){
  struct jpeg_compress_struct jcs;
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);

  FILE* f=fopen(path,"wb");
if (f==NULL)
{
printf("Save file error!\n");
return ;
}
jpeg_stdio_dest(&jcs, f);
jcs.image_width = nWidth;
jcs.image_height = nHeight;
jcs.input_components = 3;//3为RGB,可为1GRAY模式,space也要一起变化
jcs.in_color_space = JCS_RGB;
jpeg_set_defaults(&jcs);
  jpeg_set_quality (&jcs, 80, TRUE); //保存图片质量80可选
jpeg_start_compress(&jcs, TRUE);
JSAMPROW row_pointer[1];
int row_stride;
row_stride = jcs.image_width*3;
while (jcs.next_scanline < jcs.image_height) {
     //图片数据从尾部开始写入
row_pointer[0] = & pDataConv[(nHeight-jcs.next_scanline) * row_stride];
jpeg_write_scanlines(&jcs, row_pointer, 1);
}
jpeg_finish_compress(&jcs);
  jpeg_destroy_compress(&jcs);
  fclose(f);
}
char* Gray(char* path){
  int nWidth,nHeight;
  BYTE* pData=NULL;
  loadJPEG(path,&pData,&nWidth,&nHeight);
  if(pData==NULL)
    return "failed";
  ChangToGray(pData,nWidth,nHeight);
  saveJPEG(path,pData,nWidth,nHeight);
  return "success";
}


编译时候同上一篇类似,除编译命令加上-ljpeg指明调用库 用到算法库需要另外加-lm

与之前对应的在最后生成php扩展库时编译命令也要加上-lJjpeg,如下:

$ make LDFLAGS="-lgray -lJjpeg" //调用一开始放入配置的动态链接库与ljpeg库
$ make install              //这时会编译出 gary/modules/gray.so

4.测试数据
  $ gedit $apache2/htdocs/test.php  //编写测试php文件

 <?php
    echo gray("122.jpg");
  ?>


在浏览器调用后,浏览器输出success.

查看图片变成灰度图.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: