使用PHP采集远程图片

使用PHP采集远程图片,第1张

当我们需要采集网络上的某个网页内容时 如果目标网站上的做了防盗链的话 我们直接采集过来的在自己网站上是不可用的 那么我们使用程序将目标网站上的下载到我们网站服务器上 然后就可调用了

  本文将使用PHP实现采集远程功能 基本流程   获取目标网站地址   读取内容   创建要保存的路径并命名名称   写入内容   完成   我们通过写几个函数来实现这一过程   函数make_dir()建立目录 判断要保存的文件目录是否存在 如果不存在则创建目录 并且将目录设置为可写权限   function make_dir($path){   if(!file_exists($path)){//不存在则建立   $mk=@mkdir($path ); //权限   @chmod($path );   }   return true;   }   函数read_filetext()取得内容 使用fopen打开文件 然后fread读取文件内容   function read_filetext($filepath){   $filepath=trim($filepath);   $fp=@fopen($filepath "r");   //远程   if(strstr($filepath "://")){   while($data=@fread($fp )){   $string =$data;   }   }   //本地   else{   $string=@fread($fp @filesize($filepath));   }   @fclose($fp);   return $string;   }   函数write_filetext()写文件 将内容fputs写入文件中 即保存文件   function write_filetext($filepath $string){   //$string=stripSlashes($string);   $fp=@fopen($filepath "w");   @fputs($fp $string);   @fclose($fp);   }   函数get_filename()获取名称 也可以自定义要保存的文件名   function get_filename($filepath){   $fr=explode("/" $filepath);   $count=count($fr) ;   return $fr[$count];   }   然后将几个函数组合 在函数save_pic()中调用 最后返回保存后的路径   function save_pic($url $savepath= ){   //处理地址   $url=trim($url);   $url=str_replace(" " "% " $url);   //读文件   $string=read_filetext($url);   if(empty($string)){   echo 读取不了文件 ;exit;   }   //文件名   $filename = get_filename($url);   //存放目录   make_dir($savepath); //建立存放目录   //文件地址   $filepath = $savepath $filename;   //写文件   write_filetext($filepath $string);   return $filepath;   }   最后一步就是调用save_pic()函数保存 我们使用以下代码做测试   //目标地址   $pic = "/program/UploadPic/ / jpg";   //保存目录   $savepath = "images/";   echo save_pic($pic $savepath);   实际应用中 我们可能会采集某个站点的内容 比如产品信息 包括采集防盗链的保存到网站上服务器上 这时我们可以使用正则匹配页面内容 将页面中相匹配的都找出来 然后分别下载到网站服务器上 完成的采集 以下代码仅供测试   function get_pic($cont $path){   $pattern_src = /<[imgIMG] src=/picture/allimg/ / BK gif/ jpg]))[ "] [/]>/ ;   $num = preg_match_all($pattern_src $cont $match_src);   $pic_arr = $match_src[ ]; //获得数组   foreach ($pic_arr as $pic_item) { //循环取出每幅图的地址   save_pic($pic_item $path); //下载并保存   echo "[OK] !";   }   }   然后我们通过分析页面内容 将主体内容找出来 调用get_pic()实现的保存   //我们采集太平洋电脑网上一篇关于手机报道内容页的    以上代码笔者亲测 可以采集 但是还有些场景没考虑进去 比如目标网站做了 多次跳转的 目标网站做了多种防采集的 留给喜欢折腾的同学去试试吧   lishixinzhi/Article/program/PHP/201311/21001

可以看下如下的 *** 作:

1、文件是有固定格式的,像BMP是文件头+位图的颜色数据。

文件头一般在读取的时候是使用下面的代码:

 BITMAPFILEHEADER fileheader={0}; 

    fread(&fileheader,sizeof(fileheader),1,fp); 

    if(fileheaderbfType!=0x4D42)  // 判断是否为BMP

    { 

        fclose(fp); 

        return ; 

    } 

 

    BITMAPINFOHEADER head; 

    fread(&head,sizeof(BITMAPINFOHEADER),1,fp);  

    long bmpWidth = headbiWidth;     //获取的宽

    long bmpHeight = headbiHeight;   //获取的宽

    WORD biBitCount = headbiBitCount; 

    if(biBitCount != 24) // 是否为24位位图

    { 

        ::AfxMessageBox(_T("请选择24位位图!")); 

        fclose(fp); 

        return ; 

    }

2、文件读到这里了就要读到位图的颜色数据了,那么在读取前,需要知道数据的大小,这样才能把分配具体大学的缓冲区,之后把数据完整的读取到缓冲区内。

那么计算位图数据的大小一般用下面的代码去做。

int totalSize = (bmpWidth biBitCount/8+3)/44bmpHeight; 

BYTE pBmpBuf = new BYTE[totalSize];

3、在这些工作做完之后,就使用fread命令直接读取文件内容即可,直到读到文件结束。

整个具体的代码实现如下:

 FILE fp=NULL; 

    int ret = fopen_s(&fp,"D:\\11bmp","rb"); 

    if(fp==0)    

    { 

        return ; 

    } 

    BITMAPFILEHEADER fileheader={0}; 

    fread(&fileheader,sizeof(fileheader),1,fp); 

    if(fileheaderbfType!=0x4D42) 

    { 

        fclose(fp); 

        return ; 

    } 

 

    BITMAPINFOHEADER head; 

    fread(&head,sizeof(BITMAPINFOHEADER),1,fp);  

    long bmpWidth = headbiWidth; 

    long bmpHeight = headbiHeight; 

    WORD biBitCount = headbiBitCount; 

    if(biBitCount != 24) 

    { 

        ::AfxMessageBox(_T("请选择24位位图!")); 

        fclose(fp); 

        return ; 

    } 

 

    int totalSize = (bmpWidth biBitCount/8+3)/44bmpHeight; 

    BYTE pBmpBuf = new BYTE[totalSize]; 

    size_t size = 0; 

    while(true) 

    { 

        int iret = fread(&pBmpBuf[size],1,1,fp); 

        if(iret == 0) 

            break; 

        size = size + iret; 

    } 

    fclose(fp); 

 

    int i,j; 

    CClientDC dc(this); 

    int pitch=bmpWidth%4; 

    for(i=0;i<bmpHeight;i++) 

    { 

        int realPitch=ipitch; 

        for(j=0;j<bmpWidth;j++) 

        { 

            dcSetPixel(j,i,RGB( 

                pBmpBuf[(ibmpWidth+j)3+2+realPitch], 

                pBmpBuf[(ibmpWidth+j)3+1+realPitch], 

                pBmpBuf[(ibmpWidth+j)3+realPitch])); 

        } 

    } 

delete [] pBmpBuf;     pBmpBuf = NULL;

    return ;

BMP位图文件有它的属性,我们如果不读取他的属性的话,无法对它的 *** 作,

所以BMP位图文件包括1位图文件头(记录位图文件的特征到真正图像数据的偏

移量文件大小等等信息)2位图信息头(记录的就是位图的大小,每个像素占的位

数,是否压缩等等信息)3调色板(如果位图信息头里面的每个像素的位数小于24

位,就需要调色板)4真正的位图数据

为什么产生误区我觉得真正的原因是你没有明白什么是文件

文件就是把一些数据组织起来,并保存它们

而正因为数据的组织不同,所以就构成了不同的文件类型

而文件的后缀名是文件被组织了后,人民为了区别它和其他文件格式的不同而自

己取的一个名字

比方说,我这个数据是按文本组织的。那么你不管把改为什么后缀名,它还是文本

文件

以后学文件的时候别看它的后缀名,而要看它的文件的存贮实质

人们开发出来的文件格式,都有他们不同的组织方式,不是说BMP有头信息,

人家一定都要有

二进制打开文件fopen(filename,"rd")

二进制读可以用 fscanf()

#include <stdioh>

#include <stdlibh>

#include <stringh>

int main(void)

{

FILE fp;

char filename = "testdat";

int i;

char str[128];

if( (fp=fopen(filename,"rb"))== NULL )

{

以上就是关于使用PHP采集远程图片全部的内容,包括:使用PHP采集远程图片、关于怎么用C++读取bmp图片、C语言读写图片文件问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9562381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存