当前位置:  编程技术>php
本页文章导读:
    ▪php下尝试使用GraphicsMagick的缩略图功能       常用的图片处理工具有GD,ImageMagick,GraphicsMagick等等。GD就是个阿斗,略过不提;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效.........
    ▪PHP读取XML值的代码(推荐)       用Php读取XML最简单的情况: XML文件(cy.xml)如下: 代码如下: <?xml version=”1.0″ encoding=”gb2312″?> <xml> <list>1</list> <list>2</list> <list>3</list> </xml> Php文件(cy..........
    ▪PHP中simplexml_load_string函数使用说明       先用一段代码重现一下问题 乍一看,结果很让人费解: 代码如下: <?php $string = <<<EOF <data> <foo><bar>hello</bar></foo> <foo><bar>world</bar></foo> </dat.........

[1]php下尝试使用GraphicsMagick的缩略图功能
    来源: 互联网  发布时间: 2013-11-30
常用的图片处理工具有GD,ImageMagick,GraphicsMagick等等。GD就是个阿斗,略过不提;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效率更强悍,就好比Apache和Nginx一样,一个功能更强,一个效率更胜。

现在更看重效率,所以本文就以GraphicsMagick为例来说说:

对于PHPer来说,有两种使用GraphicsMagick的方式:

1:使用PECL Gmagick扩展。
2:使用GraphicsMagick命令行。

PECL扩展的方式我并不喜欢,一来PECL代码Bug多多,二来PECL扩展的实现,代码写起来很罗嗦:比如缩放一个GIF动画图片,如果你用命令行的方式,一句话就搞定,而用PECL扩展的话,还得先算动画有几帧,再循环处理,很麻烦。所以说我更倾向于使用命令行的方式,虽然命令行操作听起来很“重”,但如果建立若干台图片服务器,通过Gearman连接起来,其实很是很有弹性的。

下面我们就以GraphicsMagick为例,采用命令行的方式来看看如何使用缩略图功能:

先上一个原始图片(input.jpg:160x120),以后的各个例子都会用到它:



BTW:列位看官现在可以咽口水了。

缩略图1

gm convert input.jpg -thumbnail '100x100' output_1.jpg



实际生成的图片大小是:100x75,也就是说说按此命令,会保持图片比例不变生成缩略图。这样很不错,但是有一个潜在的问题:我们不能简单明了的知道图片的最终大小,结果是前端显示的时候,无法设置img标签的width和height属性,如果我没记错的话,一般是推荐设定width和height属性的,否则浏览器渲染起来可能会稍稍慢一点。

缩略图2

gm convert input.jpg -thumbnail '100x100!' output_2.jpg



这次实际生成的图片大小按定义来,但图片变形了,有时候这是不能接受的。

缩略图3

gm convert input.jpg -thumbnail '100x100^' \
-gravity center -extent 100x100 output_3.jpg



这次不仅保证了大小,还保证了比例。不过图片经过了裁剪。

缩略图4

gm convert input.jpg -thumbnail '100x100' \
-background gray -gravity center -extent 100x100 output_4.jpg



这次不仅保证了大小,还保证了比例,同时没有对图片进行任何裁剪,多余的部分按指定颜色进行填充。

缩略图5

gm convert input.jpg -thumbnail '10000@' \
-background gray -gravity center -extent 100x100 output_5.jpg



这次保证了大小和比例,其中的10000就是100x100的乘积,同时在填充和裁剪之间做了一个平衡。


明白了以上几个例子,缩略图基本就能通吃了,肯定有一种会适合你的需求。GraphicsMagick的资料非常少,但好消息是GraphicsMagick和ImageMagick的用法基本兼容,所以你可以通过ImageMagick的资料来套用。

补充:如果想让用户手动裁剪头片的话,imgAreaSelect是个好选择。

    
[2]PHP读取XML值的代码(推荐)
    来源: 互联网  发布时间: 2013-11-30
用Php读取XML最简单的情况:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<list>1</list>
<list>2</list>
<list>3</list>
</xml>

Php文件(cy.php)如下:
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
foreach($xml->getElementsByTagName('list') as $list)
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
?>

cy.php的运行结果:
1
2
3

=============

用Php读取XML稍微复杂一点的情况:

cy.xml如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<main>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
</xml>

cy.php如下(和第一种情况没有任何变化):
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
foreach($xml->getElementsByTagName('list') as $list)
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
?>

cy.php的运行结果和第一次也相同:
1
2
3

Php读取XML第三种情况:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<main>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
<main>
<list>4</list>
<list>5</list>
<list>6</list>
</main>
</xml>

Php文件(cy.php)如下(和第一次依然没有变化):
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
foreach($xml->getElementsByTagName('list') as $list)
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
?>

cy.php的输出结果:
1
2
3
4
5
6

===========

Php读取XML第四种情况,保持cy.xml不变,改变cy.php:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<main>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
<main>
<list>4</list>
<list>5</list>
<list>6</list>
</main>
</xml>

Php文件(cy.php)如下:
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
$main = $xml->getElementsByTagName('main');
foreach( $main as $main)
{
$list = $main->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
}
?>

cy.php输出结果:
1
2
3
4
5
6

为什么两次的cy.php不同,但输出结果是相同的?让我们来看下一个例子

==============

Php读取XML第五种情况,改变cy.xml,使cy.php保持第四种情况:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>

<main>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
<main>
<list>4</list>
<list>5</list>
<list>6</list>
</main>
<m>
<list>7</list>
<list>8</list>
<list>9</list>
</m>

</xml>

Php文件(cy.php)和第四种情况相同:
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
$main = $xml->getElementsByTagName('main');
foreach( $main as $main)
{
$list = $main->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
}
?>

cy.php输出结果为:
1
2
3
4
5
6

为什么
<m>
<list>7</list>
<list>8</list>
<list>9</list>
</m>
中的7,8,9没有被读出来?
因为我们的cy.php只读取<main></main>标记中的内容.<m></m>标记中的内容是不会被读取的.
我们这里所提到的”标记”,在XML里被称做”节点”;
关于”节点”的相关概念,我们将在以后说明.

Php读取XML情况六,再foreach一次,我们把7,8,9读出来!:

XML文件(cy.xm)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<main>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
<main>
<list>4</list>
<list>5</list>
<list>6</list>
</main>
<m>
<list>7</list>
<list>8</list>
<list>9</list>
</m>
</xml>

Php文件(cy.php)如下:
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
$main = $xml->getElementsByTagName('main');
foreach( $main as $main)
{
$list = $main->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
}
$m = $xml->getElementsByTagName('m');
foreach( $m as $m)
{
$list = $m->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
}
?>

cy.php输出结果:
1
2
3
4
5
6
7
8
9

===============

Php读取XML情况七,cy.xml变得更复杂一些:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<main>
<title>a</title>
<list>1</list>
<list>2</list>
<list>3</list>
</main>
<main>
<title>b</title>
<list>4</list>
<list>5</list>
<list>6</list>
</main>
<m>
<title>c</title>
<list>7</list>
<list>8</list>
<list>9</list>
</m>
</xml>

那么,我们如何只读出<main></main>内<title></title>中的值呢?

Php文件(cy.php)如下:
代码如下:

<?php
$xml = new DOMDocument();
$xml->load('cy.xml');
$main = $xml->getElementsByTagName('main');
foreach( $main as $main)
{
$list = $main->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
$title = $main->getElementsByTagName( “title” );
foreach ( $title as $title )
{
$value = $title->firstChild->nodeValue;
echo $value.”<br />”;
}
}

$m = $xml->getElementsByTagName('m');
foreach( $m as $m)
{
$list = $m->getElementsByTagName( “list” );
foreach ( $list as $list )
{
$value = $list->firstChild->nodeValue;
echo $value.”<br />”;
}
}
?>

cy.php输出结果:
1
2
3
a
4
5
6

7
8
9

想一下,如何读出<m>中<title></title>的值?

Php读取XML再通过一个例子巩固一下:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<LevelOne>
<LevelTwo>
<LevelThree id=”1″>This is Text One</LevelThree>
<LevelThree id=”2″>This is Text Two</LevelThree>
<LevelThree id=”3″>This is Text Three</LevelThree>
</LevelTwo>
<LevelTwo>
<LevelThree id=”4″>This is Text Four</LevelThree>
<LevelThree id=”5″>This is Text Five</LevelThree>
<LevelThree id=”6″>This is Text Six</LevelThree>
</LevelTwo>
</LevelOne>

Php文件(cy.php)如下:
代码如下:

<?php
$xml = new DOMDocument(); //建立一个DOMDocument
$xml->load('cy.xml'); //Php指定需要读取xml文件的位置
$LevelOne = $xml->getElementsByTagName('LevelOne');//按照名称取得节点,返回所有节点的集合,不过这里这样读LevelOne是没有意义的….
$LevelOne = $xml->getElementsByTagName('LevelOne')->item(0);//返回第一个LevelOne节点中的内容
$LevelTwo = $LevelOne->getElementsByTagName('LevelTwo'); //按照名称取得节点,返回所有LevelTwo
foreach ( $LevelTwo as $Content )//循环读出所有LevelTwo,并在循环里,把LevelTwo用Content表示
{
$LevelThree = $Content->getElementsByTagName('LevelThree');//返回所有LevelThree
foreach ( $LevelThree as $Concert )
{
$name = $Concert->nodeName;//节点名称
$value = $Concert->nodeValue;//节点值
$id = $Concert->getAttribute('id');//”id”属性值
echo $name.”<br />”;
echo $value.”<br />”;
echo $id.”<br />”;
}
}
?>

如果用$LevelOne = $xml->getElementsByTagName('LevelOne')这样的方式取得节点,那么,读取里面的内容,需要用foreach 循环,因为$LevelOne = $xml->getElementsByTagName ('LevelOne')返回的,是一个集合,并不是一个具体的节点—-仅管叫做LevelOne的节点只有一个….
如果用$LevelOne = $xml->getElementsByTagName('LevelOne')->item(0)这样的方式取得节点,那么读取里面的内 容,可以直接$LevelOne->xxxxxx,因为这样返回的是一个具体的节点。

现在提供一种很简便的方法用PHP读取XML:

XML文件(cy.xml)如下:
代码如下:

<?xml version=”1.0″ encoding=”gb2312″?>
<xml>
<site>
<part id=”1″>
<title id=”a”>czbin xml版块</title>
<describe>xml的相关文章</describe>
</part>
<part id=”2″>
<title id=”b”>czbin php版块</title>
<describe>php的相关文章</describe>
</part>
<part id=”3″>
<title id=”c”>czbin ajax版块</title>
<describe>ajax的相关文章</describe>
</part>
</site>
</xml>

Php文件(cy.php)如下:
代码如下:

<?php
$xml = simplexml_load_file('sxml.xml');
$part = $xml->site->part;
foreach ( $part as $content )
{
echo $content['id'].”<br />”;
echo $content->title.”<br />”;
echo $content->title['id'].”<br />”;
echo $content->describe.”<br />”;
}
?>

cy.php输出结果:
1
czbin xml版块
a
xml的相关文章
2
czbin php版块

php的相关文章
3
czbin ajax版块
c
ajax的相关文章

怎么样?的确很简单吧!

    
[3]PHP中simplexml_load_string函数使用说明
    来源: 互联网  发布时间: 2013-11-30
先用一段代码重现一下问题
乍一看,结果很让人费解:
代码如下:

<?php
$string = <<<EOF
<data>
<foo><bar>hello</bar></foo>
<foo><bar>world</bar></foo>
</data>
EOF;

$data = simplexml_load_string($string);

print_r($data);
print_r($data->foo);
?>

乍一看,结果很让人费解:
代码如下:

SimpleXMLElement Object
(
[foo] => Array
(
[0] => SimpleXMLElement Object
(
[bar] => hello
)
[1] => SimpleXMLElement Object
(
[bar] => world
)
)
)
SimpleXMLElement Object
(
[bar] => hello
)

明明print_r显示foo是一个有两个bar元素的数组,但是最后却仅仅显示了一个bar元素!
原因其实很简单,在如上所示simplexml_load_string的结果里,foo并不是数组,而是一个迭代对象!
可以这样确认:
代码如下:

foreach ($data->foo as $v) print_r($v);
foreach ($data->children() as $v) print_r($v);

看来,print_r或者var_dump之类的表象并不完全可信,自己多留心吧。

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3