一个全面获取图象信息的函数,包括EXIF信息0+

14 views / 2010.03.09 / 12:12 下午

呵呵,中文化的EXIF解析,是不是你想要的呢?使用此方法,可以任意改写出你所需要的东东。

<?
/**
* 获取图象信息的函数
*
* 一个全面获取图象信息的函数
*
* @access public
* @param string $img 图片路径
* @return array
*/
function GetImageInfoVal($ImageInfo,$val_arr) {
    $InfoVal    =    "未知";
    foreach($val_arr as $name=>$val) {
        if ($name==$ImageInfo) {
            $InfoVal    =    &$val;
            break;
        }
    }
    return $InfoVal;
}
function GetImageInfo($img) {
 
    $imgtype            =    array("", "GIF", "JPG", "PNG", "SWF", "PSD", "BMP", "TIFF(intel byte order)", "TIFF(motorola byte order)", "JPC", "JP2", "JPX", "JB2", "SWC", "IFF", "WBMP", "XBM");
    $Orientation        =    array("", "top left side", "top right side", "bottom right side", "bottom left side", "left side top", "right side top", "right side bottom", "left side bottom");
    $ResolutionUnit        =    array("", "", "英寸", "厘米");
    $YCbCrPositioning    =    array("", "the center of pixel array", "the datum point");
    $ExposureProgram    =    array("未定义", "手动", "标准程序", "光圈先决", "快门先决", "景深先决", "运动模式", "肖像模式", "风景模式");
    $MeteringMode_arr    =    array(
        "0"        =>    "未知",
        "1"        =>    "平均",
        "2"        =>    "中央重点平均测光",
        "3"        =>    "点测",
        "4"        =>    "分区",
        "5"        =>    "评估",
        "6"        =>    "局部",
        "255"    =>    "其他"
        );
    $Lightsource_arr    =    array(
        "0"        =>    "未知",
        "1"        =>    "日光",
        "2"        =>    "荧光灯",
        "3"        =>    "钨丝灯",
        "10"    =>    "闪光灯",
        "17"    =>    "标准灯光A",
        "18"    =>    "标准灯光B",
        "19"    =>    "标准灯光C",
        "20"    =>    "D55",
        "21"    =>    "D65",
        "22"    =>    "D75",
        "255"    =>    "其他"
        );
    $Flash_arr            =    array(
        "0"        =>    "flash did not fire",
        "1"        =>    "flash fired",
        "5"        =>    "flash fired but strobe return light not detected",
        "7"        =>    "flash fired and strobe return light detected",
        );
 
    $exif = exif_read_data ($img,"IFD0");
    if ($exif===false) {
        $new_img_info    =    array ("文件信息"        =>    "没有图片EXIF信息");
    }
    else
    {
        $exif = exif_read_data ($img,0,true);
        $new_img_info    =    array (
            "文件信息"        =>    "-----------------------------",
            "文件名"        =>    $exif[FILE][FileName],
            "文件类型"        =>    $imgtype[$exif[FILE][FileType]],
            "文件格式"        =>    $exif[FILE][MimeType],
            "文件大小"        =>    $exif[FILE][FileSize],
            "时间戳"        =>    date("Y-m-d H:i:s",$exif[FILE][FileDateTime]),
            "图像信息"        =>    "-----------------------------",
            "图片说明"        =>    $exif[IFD0][ImageDescription],
            "制造商"        =>    $exif[IFD0][Make],
            "型号"            =>    $exif[IFD0][Model],
            "方向"            =>    $Orientation[$exif[IFD0][Orientation]],
            "水平分辨率"    =>    $exif[IFD0][XResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
            "垂直分辨率"    =>    $exif[IFD0][YResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
            "创建软件"        =>    $exif[IFD0][Software],
            "修改时间"        =>    $exif[IFD0][DateTime],
            "作者"            =>    $exif[IFD0][Artist],
            "YCbCr位置控制"    =>    $YCbCrPositioning[$exif[IFD0][YCbCrPositioning]],
            "版权"            =>    $exif[IFD0][Copyright],
            "摄影版权"        =>    $exif[COMPUTED][Copyright.Photographer],
            "编辑版权"        =>    $exif[COMPUTED][Copyright.Editor],
            "拍摄信息"        =>    "-----------------------------",
            "Exif版本"        =>    $exif[EXIF][ExifVersion],
            "FlashPix版本"    =>    "Ver. ".number_format($exif[EXIF][FlashPixVersion]/100,2),
            "拍摄时间"        =>    $exif[EXIF][DateTimeOriginal],
            "数字化时间"    =>    $exif[EXIF][DateTimeDigitized],
            "拍摄分辨率高"    =>    $exif[COMPUTED][Height],
            "拍摄分辨率宽"    =>    $exif[COMPUTED][Width],
            /*
            The actual aperture value of lens when the image was taken.
            Unit is APEX.
            To convert this value to ordinary F-number(F-stop),
            calculate this value's power of root 2 (=1.4142).
            For example, if the ApertureValue is '5', F-number is pow(1.41425,5) = F5.6.
            */
            "光圈"            =>    $exif[EXIF][ApertureValue],
            "快门速度"        =>    $exif[EXIF][ShutterSpeedValue],
            "快门光圈"        =>    $exif[COMPUTED][ApertureFNumber],
            "最大光圈值"    =>    "F".$exif[EXIF][MaxApertureValue],
            "曝光时间"        =>    $exif[EXIF][ExposureTime],
            "F-Number"        =>    $exif[EXIF][FNumber],
            "测光模式"        =>    GetImageInfoVal($exif[EXIF][MeteringMode],$MeteringMode_arr),
            "光源"            =>    GetImageInfoVal($exif[EXIF][LightSource], $Lightsource_arr),
            "闪光灯"        =>    GetImageInfoVal($exif[EXIF][Flash], $Flash_arr),
            "曝光模式"        =>    ($exif[EXIF][ExposureMode]==1?"手动":"自动"),
            "白平衡"        =>    ($exif[EXIF][WhiteBalance]==1?"手动":"自动"),
            "曝光程序"        =>    $ExposureProgram[$exif[EXIF][ExposureProgram]],
            /*
            Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv).
            Ev=Bv+Sv   Sv=log((ISOSpeedRating/3.125),2)
            ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.
            */
            "曝光补偿"        =>    $exif[EXIF][ExposureBiasValue]."EV",
            "ISO感光度"        =>    $exif[EXIF][ISOSpeedRatings],
            "分量配置"        =>    (bin2hex($exif[EXIF][ComponentsConfiguration])=="01020300"?"YCbCr":"RGB"),//'0x04,0x05,0x06,0x00'="RGB" '0x01,0x02,0x03,0x00'="YCbCr"
            "图像压缩率"    =>    $exif[EXIF][CompressedBitsPerPixel]."Bits/Pixel",
            "对焦距离"        =>    $exif[COMPUTED][FocusDistance]."m",
            "焦距"            =>    $exif[EXIF][FocalLength]."mm",
            "等价35mm焦距"    =>    $exif[EXIF][FocalLengthIn35mmFilm]."mm",
            /*
            Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji).
            '0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
            '0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
            '0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
            '0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined
            */
            "用户注释编码"    =>    $exif[COMPUTED][UserCommentEncoding],
            "用户注释"        =>    $exif[COMPUTED][UserComment],
            "色彩空间"        =>    ($exif[EXIF][ColorSpace]==1?"sRGB":"Uncalibrated"),
            "Exif图像宽度"    =>    $exif[EXIF][ExifImageLength],
            "Exif图像高度"    =>    $exif[EXIF][ExifImageWidth],
            "文件来源"        =>    (bin2hex($exif[EXIF][FileSource])==0x03?"digital still camera":"unknown"),
            "场景类型"        =>    (bin2hex($exif[EXIF][SceneType])==0x01?"A directly photographed image":"unknown"),
            "缩略图文件格式"    =>    $exif[COMPUTED][Thumbnail.FileType],
            "缩略图Mime格式"    =>    $exif[COMPUTED][Thumbnail.MimeType]
        );
    }
    return $new_img_info;
}
 
//Example
 
print_r(GetImageInfo("DSC00596.JPG"));
 
?>
Categories: 分享 Tags:

简评file_get_contents与curl 效率及稳定性0+

103 views / 2010.02.06 / 5:05 下午

做过好多抓取别家网站内容的产品,习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:

$config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,
   ’timeout’ => 5//这个超时时间不稳定,经常不奏效
   )
  ));

这时候,看一下服务器的连接池,会发现一堆类似的错误,让你头疼万分:

file_get_contents(http://***): failed to open stream…

不得已,安装了curl库,写了一个函数替换:

function curl_file_get_contents($durl){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $durl);
   curl_setopt($ch, CURLOPT_TIMEOUT, 5);
   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   $r = curl_exec($ch);
   curl_close($ch);
   return $r;
 }

如此,除了真正的网络问题外,没再出现任何问题。

这是别人做过的关于curl和file_get_contents的测试:

file_get_contents抓取google.com需用秒数:

2.31319094
2.30374217
2.21512604
3.30553889
2.30124092

curl使用的时间:

0.68719101
0.64675593
0.64326
0.81983113
0.63956594

差距很大吧?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!

Categories: 感悟 Tags: ,

重视HTML文件头部声明0+

64 views / 2010.02.04 / 10:10 上午

以前处理页面,习惯…这样写下去,后来W3C开始流行,发现好多好玩的东西在这样的标签下都不支持了,比如样式表中让元素居中的写法,margin:0 auto;
于是只好使用这样的写法了:

<!–CTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt–>

再写一个函数,比如原来的documeng.body.scrollTop在原有写法上是奏效的,但到了新标准中就会变为0,只好多加一些判断:

function getSrollTop(){
var scrollPos;
if (typeof window.pageYOffset != 'undefined') {
scrollPos = window.pageYOffset;
}
else if (typeof document.compatMode != 'undefined' &&
document.compatMode != 'BackCompat') {
scrollPos = document.documentElement.scrollTop;
}
else if (typeof document.body != 'undefined') {
scrollPos = document.body.scrollTop;
}
return scrollPos;
}
Categories: 感悟 Tags: ,

免费使用天涯只看楼主功能 – 免登录0+

106 views / 2010.02.03 / 12:12 下午

操作方法:

1.打开浏览器,随便添加一个网页到收藏夹中,添加的时候把名称更改为“只看楼主”,确定。

2.在收藏夹中右键点击刚添加的链接,属性,把url替换为 “javascript:V.lookByAuthor(chrAuthorName);”引号中的内容,确定

3.随便打开天涯一个帖子,然后点击收藏夹中的“只看楼主”这个链接,目标实现。

呵呵,你也可以把这个功能放在浏览器顶端的标签栏中,使用起来更加方便快捷。

Categories: 感悟 Tags:

linux系统dig和nslookup的安装0+

95 views / 2010.01.28 / 1:01 下午

nslookup是常用来查询本机域名解析情况的命令,但是一些linux系统下默认无此命令。我们可以通过安装一个包来使该命令生效,这个包中也包括dig命令。

Ubuntu:

# sudo apt-get install dnsutils

Debian:

# apt-get update
# apt-get install dnsutils

Fedora / Centos:

# yum install bind-utils
Categories: 分享 Tags: , ,