PHPimagecreatefrombmp创建从BMP文件或URL的图像
使用下面的函数可以很容易地解决
复制代码代码如下所示:
功能imagecreatefrombmp(文件)
{
全球currentbit美元,echomode美元;
$ F = fopen(文件,R);
$标题= fread($,2);
如果(头=BM)
{
美元($)freaddword大小=;
保留1 = freadword美元($);
保留2 = freadword美元($);
firstbyteofimage = freaddword美元($);
sizebitmapinfoheader = freaddword美元($);
宽度= freaddword美元($);
高度= freaddword美元($);
美元($)= freadword双翼;
bibitcount = freadword美元($);
rlecompression = freaddword美元($);
widthxheight = freaddword美元($);
bixpelspermeter = freaddword美元($);
biypelspermeter = freaddword美元($);
numberofpalettesused = freaddword美元($);
numberofimportantcolors = freaddword美元($);
如果($ bibitcount<24)
{
img =画面欣赏美元(美元美元的宽度,高度);
颜色=战俘(2美元,bibitcount美元);
对于($ = 0;$ < $颜色;$ + +)
{
B = freadbyte美元($);
G = freadbyte美元($);
R = freadbyte美元($);
美元($)freadbyte保留=;
调色板{ } = imagecolorallocate(美元美元美元美元IMG,R,G,B美元);
}
如果($ rlecompression = = 0)
{
zbytek美元=((4-ceil(($宽度/(8元/ bibitcount)))% 4)% 4;
为($ Y = $ height-1;Y元> = 0;Y元--)
{
currentbit = 0美元;
($ x = 0;$ x千美元宽度;$ x +)
{
C = freadbits美元($,$ bibitcount);
imagesetpixel($ IMG,X、Y元,美元美元调色板{ });
}
如果(currentbit美元!= 0){ freadbyte($);}
为($ G = 0;G组zbytek美元美元美元;G + +)
Freadbyte($);
}
}
}
如果($ rlecompression = = 1) / / bi_rle8美元
{
$ y = $高度;
pocetb = 0美元;
虽然(真实)
{
美元—;
前缀= freadbyte美元($);
后缀= freadbyte美元($);
pocetb + = 2美元;
echoit美元= false;
如果($ echoit)回波前缀,前缀后缀后缀:美元美元;
如果((前缀= = 0)和($后缀= 1))中断;
如果(外汇经营资金($))打破;
而(!(($前缀= 0)和($后缀= 0))
{
如果($ = 0)
{
袖珍=美元美元的后缀;
美元数据。= fread($,$ POCET);
pocetb美元= POCET美元;
如果($ pocetb % 2 = = 1){ freadbyte($);$ pocetb ++;}
}
如果(前缀$ 0)
{
袖珍= $前缀美元;
为($ R = 0;r<袖珍美元;r + +)
美元数据。= CHR($后缀);
}
前缀= freadbyte美元($);
后缀= freadbyte美元($);
pocetb + = 2美元;
如果($ echoit)回波前缀,前缀后缀后缀:美元美元;
}
为($ x = 0;X元< strlen($数据);X元+ +)
{
imagesetpixel($ IMG,X、Y元,$调色板{ ORD($数据{ x美元})));
}
$;
}
}
如果($ rlecompression = = 2) / / bi_rle4美元
{
$ y = $高度;
pocetb = 0美元;
(虽然)!Feof($))
回声freadbyte($)。_。Freadbyte($);* /。
虽然(真实)
{
;
美元—;
前缀= freadbyte美元($);
后缀= freadbyte美元($);
pocetb + = 2美元;
echoit美元= false;
如果($ echoit)回波前缀,前缀后缀后缀:美元美元;
如果((前缀= = 0)和($后缀= 1))中断;
如果(外汇经营资金($))打破;
而(!(($前缀= 0)和($后缀= 0))
{
如果($ = 0)
{
袖珍=美元美元的后缀;
currentbit = 0美元;
为($ H = 0;美元美元美元H<袖珍;H + +)
美元数据。= CHR(freadbits($,4));
如果(currentbit美元!= 0)freadbits($,4);
pocetb美元=细胞((($ POCET / 2));
如果($ pocetb % 2 = = 1){ freadbyte($);$ pocetb ++;}
}
如果(前缀$ 0)
{
袖珍= $前缀美元;
$ I = 0;
为($ R = 0;r<袖珍美元;r + +)
{
如果($ i = 2 = 0)
{
美元数据。= CHR(后缀为16美元);
}
其他的
{
美元数据。= CHR(地板($后缀 / 16));
}
美元+;
}
}
前缀= freadbyte美元($);
后缀= freadbyte美元($);
pocetb + = 2美元;
如果($ echoit)回波前缀,前缀后缀后缀:美元美元;
}
为($ x = 0;X元< strlen($数据);X元+ +)
{
imagesetpixel($ IMG,X、Y元,$调色板{ ORD($数据{ x美元})));
}
数据= 美元;
}
}
如果($ bibitcount = = 24)
{
img =新建一个真彩色图像(美元美元美元的宽度,高度);
zbytek = $ 4美元的宽度;
为($ Y = $ height-1;Y元> = 0;Y元--)
{
($ x = 0;$ x千美元宽度;$ x +)
{
B = freadbyte美元($);
G = freadbyte美元($);
R = freadbyte美元($);
颜色= imagecolorexact(美元美元美元美元IMG,R,G,B美元);
如果($颜色= = 1)颜色= imagecolorallocate美元(美元美元美元IMG,R,G,B美元);
imagesetpixel($ IMG,X、Y元,合色);
}
为($ Z = 0;美元美元美元Z < zbytek;Z + +)
Freadbyte($);
}
}
Return $img;
}
Fclose($);
}
功能freadbyte($)
{
返回ORD(fread($,1));
}
功能freadword($)
{
B1 = freadbyte美元($);
B2 = freadbyte美元($);
返回$ B2 * 256 + B1;
}
功能freaddword($)
{
B1 = freadword美元($);
B2 = freadword美元($);
返回$ B2 * 65536 + B1;
}