用PHP读写PGM(P5)图像文件 [英] Read and Write PGM (P5) Image File in PHP
本文介绍了用PHP读写PGM(P5)图像文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在PHP中,可以使用 fread()和 fwrite()完成简单的读写文件. unpack()和 pack()运算符用于提取二进制信息.
In PHP, a simple read and write file can be done by using fread() and fwrite(). The unpack() and pack() operator are used to extract binary information.
问题是,如何在不使用任何其他PHP扩展/库的情况下用PHP读写PGM(P5)图像?
The question is, how can I read and write PGM (P5) image in PHP without using any additional PHP extension / library?
推荐答案
根据灰度的最大值,您将必须使用C*
表示最大值为255,而使用n*
表示更大的值.
Depending on maximum value for gray you will have to use C*
for values up to 255 and n*
for greater values.
用于从数组读取/写入所有像素的示例类:
Sample class to read / write all pixel from array:
class PGM{
public
$magicNumber = '',
$pixelArray = array(),
$width = 0,
$height = 0,
$grayMax = 0,
$createdBy = '';
public function loadPGM($filename){
$this->grayMax = $this->height = $this->width = $this->magicNumber = 0;
$this->pixelArray = array();
$fh = fopen($filename, 'rb');
while($line = fgets($fh)){
if(strpos($line, '#') === 0){
continue;
}
if(!$this->grayMax){
$arr = preg_split('/\s+/', trim($line));
if($arr && !$this->magicNumber){
$this->magicNumber = array_shift($arr);
if($this->magicNumber != 'P5'){
throw new Exception("Unsupported PGM version");
}
}
if($arr && !$this->width)
$this->width = array_shift($arr);
if($arr && !$this->height)
$this->height = array_shift($arr);
if($arr && !$this->grayMax)
$this->grayMax = array_shift($arr);
}else{
$unpackMethod = ($this->grayMax > 255)?'n*':'C*';
foreach(unpack($unpackMethod, $line) as $pixel){
$this->pixelArray[] = $pixel;
}
}
}
fclose($fh);
}
public function savePGM($filename){
$fh = fopen($filename, 'wb');
$this->magicNumber = 'P5';
fwrite($fh, "{$this->magicNumber}\n");
if($this->createdBy){
fwrite($fh, "# {$this->createdBy}\n");
}
fwrite($fh, "{$this->width} {$this->height}\n");
fwrite($fh, "{$this->grayMax}\n");
$packMethod = ($this->grayMax > 255)?'n*':'C*';
fwrite($fh, call_user_func_array('pack', array_merge(array($packMethod), $this->pixelArray)));
fclose($fh);
}
}
文件的测试用例:
$pgm = new PGM;
$pgm->loadPGM('a.pgm');
$pgm->createdBy = 'Created by IrfanView';
$pgm->savePGM('b.pgm');
echo (md5_file('a.pgm') == md5_file('b.pgm'))?'Images are identical':'Images are different';
这篇关于用PHP读写PGM(P5)图像文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文