imagecreatetruecolor

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecreatetruecolor创建一个新的真彩色图像

说明

imagecreatetruecolor(int $width, int $height): GdImage|false

imagecreatetruecolor() 返回一个图像对象,它表示指定大小的黑色图像。

参数

width

图像宽度。

height

图像高度。

返回值

成功时返回一个图像对象,有错误时返回 **false**。

变更日志

版本 说明
8.0.0 成功时,此函数现在返回一个 GDImage 实例;以前,返回一个 resource

范例

范例 #1 创建新的 GD 图像流并输出图像。

<?php
header
('Content-Type: image/png');
$im = @imagecreatetruecolor(120, 20)
or die(
'无法初始化新的 GD 图像流');
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, '这是一个简单文本字符串', $text_color);
imagepng($im);
imagedestroy($im);
?>

上例将输出类似以下内容

Output of example : Creating a new GD image stream and outputting an image.

参见

添加注释

用户添加的注释 37 注释

Richard Davey rich at corephp dot co dot uk
17 年前
如果您想要创建一张 *透明的* PNG 图像,其中背景完全透明,且所有绘图操作都发生在此之上,那么请执行以下操作

<?php
$png
= imagecreatetruecolor(800, 600);
imagesavealpha($png, true);

$trans_colour = imagecolorallocatealpha($png, 0, 0, 0, 127);
imagefill($png, 0, 0, $trans_colour);

$red = imagecolorallocate($png, 255, 0, 0);
imagefilledellipse($png, 400, 300, 400, 300, $red);

header("Content-type: image/png");
imagepng($png);
?>

您所做的是创建一个真彩色图像,确保开启 alpha 保存状态,然后用一个 alpha 级别设置为完全透明 (127) 的颜色填充图像。

上述代码生成的 PNG 将在完全透明的背景上有一个红色圆圈(将图像拖动到 Photoshop 中亲眼看看)
arthur at kuhrmeier dot com
13 年前
在创建图像之前如何检查内存?

我制作了一组用来处理大幅图像的脚本。弹出频率较高的错误是“内存不足”。于是我不得不找出,在创建图像之前如何检查内存。我在网上没有找到解决方案,所以我运行了自己的测试脚本。它构建了很多图像来计算需要的内存。我发现,内存 = x * y * 通道的公式是不够用的。多了一个变化的倍数。结果,1.7 最好用。所以公式就是:内存 = x * y * 通道 * 1.7。

我在这里发布这个脚本,希望能对遇到相同问题的用户有所帮助。

<?php
//-------------------------------------------------- DEFINE MAXMEM
define ("MAXMEM", 32*1024*1024); //--- memory limit (32M) ---

//-------------------------------------------------- ENOUGH MEMORY ?
function enoughmem ($x, $y, $rgb=3) {
return (
$x * $y * $rgb * 1.7 < MAXMEM - memory_get_usage() );
}

//-------------------------------------------------- SIMPLE EXAMPLE
list ($x, $y) = @getimagesize ('your_img.jpg'); //--- get size of img ---
if (enoughmem($x,$y)) {
$img = @imagecreatefromjpeg ('your_img.jpg'); //--- open img file ---
$thumb = 200; //--- max. size of thumb ---
if ($x > $y) {
$tx = $thumb; //--- landscape ---
$ty = round($thumb / $x * $y);
} else {
$tx = round($thumb / $y * $x); //--- portrait ---
$ty = $thumb;
}
if (
enoughmem($tx,$ty)) {
$thb = imagecreatetruecolor ($tx, $ty); //--- create thumbnail ---
imagecopyresampled ($thb,$img, 0,0, 0,0, $tx,$ty, $x,$y);
imagejpeg ($thb, 'your_thumbnail.jpg', 80);
imagedestroy ($thb);
}
imagedestroy ($img);
}

//--------------------------------------------------
//--- to check the memory working with ---
//--- b/w-image or gif use: ---
//--------------------------------------------------
$check = enoughmem ($x, $y, 1);
?>

借此机会,我要感谢 php.net 中每位用户对精彩手册和有用的用户脚本所做的贡献。
kai at meder dot info
19 年前
使用 imagecolorallocate 指定图像背景颜色无法配合真色彩图像。

相反,您必须使用 imagefill 来强制使用先前分配的背景色填充图像

$bgColor = imagecolorallocate($img, 255,255,255);
imagefill($img , 0,0 , $bgColor);

kai
Anonymous
19 年前
// 创建透明图像,而不是默认的黑色图像
function imageCreateTransparent($x, $y) {
$imageOut = imagecreate($x, $y);
$colourBlack = imagecolorallocate($imageOut, 0, 0, 0);
imagecolortransparent($imageOut, $colourBlack);
return $imageOut;
}
aaron at aaron-wright dot com
21 年前
实际的 GD<2.0 有 imagecreattruecolor,只是不起作用 :P

这个是更好的测试

function chkgd2(){
$testGD = get_extension_funcs("gd"); // 获取函数列表
if (!$testGD){ echo "甚至没有安装 GD。"; exit; }
if (in_array ("imagegd2",$testGD)) $gd_version = "<2"; // 检查
if ($gd_version == "<2") return false; else return true;
}

if (chkgd2()) echo "<h1>已安装 GD2+。</h1>"; // 测试 GD2
else echo "<h1>未安装 GD2+。</h1>";
jessiedeer at hotmail dot com
10 年前
使用 imagecreatetruecolor 不需要分配颜色。所有 [256 x 256 x 256 x 128] 真色彩都已经分配了,您可以直接使用颜色索引。

示例
蓝色 => 颜色索引 255。
白色 => 颜色索引 16777215 (= 255*256² + 255*256+255)。
全透明 => 颜色索引 2130706432 (= 127*256^3)。
d dot duquenoy at kdland dot org
18 年前
我的函数在使用前,能够了解 imagecreate 或 imagecreatetruecolor 需要多少字节。
<?php
函数 getNeededMemoryForImageCreate($width, $height, $truecolor) {
返回
$width*$height*(2.2+($truecolor*3));
}
?>
weareexit at yahoo dot co dot uk
16 年前
如果你想将图片放置在你先前用 imagecreatetruecolor() 创建的大尺寸画布上,但又不想要用默认的黑色背景围绕它:在 imagecopyresampled() 之后使用 imagefill()。

我不知道为什么会这样,但这起作用!
send at mail dot 2aj dot net
19 年前
如果你想用一个简单的方法镜像图片,使用我下方包括的函数。

<?php
函数 image_mirror ($input_image_resource)
{
$width = imagesx ( $input_image_resource );
$height = imagesy ( $input_image_resource );
$output_image_resource = imagecreatetruecolor ( $width, $height );
$y = 1;

while (
$y < $height )
{
对于 (
$i = 1; $i <= $width; $i++ )
imagesetpixel ( $output_image_resource, $i, $y, imagecolorat ( $input_image_resource, ( $i ), ( $height - $y ) ) );
$y = $y + 1;
}

返回
$output_image_resource;
}
?>
示例用法
<?php

// 此例中极好的用途在于用户上传 TGA 文件时,
// 在完成屏幕上显示该图像并提供一个
// 咨询该图像是否看起来镜像翻转的链接,如果确实
// 如此,则该链接将执行以下命令。

// 我建议检查 $HTTP_REFERER 以确保安全性。

// 此示例中的 $_GET['file'] 可能类似
// 于 johndoe-img0001(基本名称对于防止
// 滥用此脚本非常必要!)

if ( isset( $_GET['file'] ) )
{
$filename = "./" . basename ( $_GET['file'] ) . ".jpg";
// 创建需要镜像的图像资源
// 由先前导出为 JPEG 文件获取。
$output_resource_image = image_mirror ( imagecreatefromjpeg ( $filename ) );
if (
imagejpeg ( $output_resource_image, $filename, 75 ) )
echo
"图像已成功重新保存";
else
echo
"无法覆盖图像(检查权限)!";
}
?>
Jami
21 年前
创建带有真实颜色的缩略图时最好使用 imagecopyresampled- 函数,它看起来可能比 imagecopyresized 更好看。
fixxxer at php5 dot ru
20 年前
Justin Greer 于 2003 年 11 月 18 日上午 10:40 发布。

虽然这个信息已由 php 发送至 REMOVEreallynicejerk dot com @ 16-Sep-2002 12:01,但我觉得有必要注意,因为 Justin 的帖子排在最上面,并可能误导人们:Justin 检测要使用哪个 imagecreate 函数的方法过于复杂,而有一个标准的简单方法

<?php
if (function_exists('imagecreatetruecolor') {
// 使用 imagecreatetruecolor
} else {
// 使用 imagecreate
}
marc at thewebguys dot com dot au
21 年前
我发现安装 GD 2+ 时 ImageCreate() 对 JPEG 表现不佳,它在合并 ImageCreateFromJPEG() 时会将真彩色 JPEG 变成 16 色混乱画面。如果你拥有 GD 2+,你必须使用 ImageCreateTrueColor() 来创建诸如缩略图一类的元素。
eric at spiderws dot com
23 年前
这个小功能可以实现

<?
$image_id = imageCreateFromJPEG($image);
for($a=0;$a<imagecolorstotal ($image_id);$a++)
{
$color = ImageColorsForIndex($image_id,$i);
$R=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
$G=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
$B=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
ImageColorSet($image_id, $a, $R, $G, $B);
}
imageJPEG($image_id,"$image");
?>

.299、.578、.114 是估值,并向颜色添加伽马校正。为了获得更多或更少的结果亮度,您可以更改这些值。

祝好,
荷兰 Eric Mulders
Hamza Ahmad
3 年前
从 PHP 8 开始,图像创建函数的返回类型是 GdImage,而不是资源。因此,人们可以进行类型提示。
<?php
class MyImage {
private
GdImage $img;
};
?>
同样,<?php
function save_image(GdImage $img, string $name, string $directory = null) : bool
{
/*...*/
};
?>
Florin [ florin.at.flachi.dot.net ]
18 年前
一种非常简单有效的方法,可将十六进制 (HTML) 表示创建 RGB 颜色

<?php

function color_hex2dec ($color) {
return array (
hexdec (substr ($color, 0, 2)), hexdec (substr ($color, 2, 2)), hexdec (substr ($color, 4, 2)));
}

list (
$r, $g, $b) = color_hex2dec ('FFEECC');

?>
j.fenin _At_ seekport [d0t] biz
18 年前
使用 PHP5 版 Debian Linux 时,我遇到一个奇怪的 bug。

在文件 B(我在其中创建图像)中,我包含了一个文件(文件 A)。生成的图像总会出现损坏。如果不包含文件 A,则一切都正常。

经过 2 小时的搜索,我发现在文件 A 中的 PHP 结束标签 ?> 之后有一些额外的空格和换行符。清除这些字符后,一切又可以正常工作。

很显然,文件 A 中的这些额外字节被添加到图像中,并导致图像损坏。
Justin Greer
20 年前
我知道这不是讨论板,但当错误的信息发布时,应该进行更正。

function_exists() 检查不起作用,这是因为如果使用较旧的 GD 库编译 PHP,则仍存在 imagecreatetruecolor() 函数——调用该函数时它只会给出致命错误,表明需要 GD2。因此,在仅具有 GD 1.x 的任何较新版本的 PHP 上,function_exists() 方法都将失败。(这包括我见过的 4.1.x 和 4.2.x 安装程序的大部分。)
Justin Greer
20 年前
不幸的是,@imagecreatetruecolor() 方法甚至不起作用,因为带有致命错误(指出需要 GD 2)的 PHP 会挂掉。你甚至无法使用自定义错误处理程序捕获此错误。

我提出过一个获取 GD 版本号的函数,该函数似乎可以在我遇到的所有版本的 PHP 和 GD 上正常工作(甚至包括 CLI 版本)。很明显,它不是世界上最高效的东西,但确实将结果缓存在静态变量中,因此多次调用不会进一步减慢速度。

function gd_version() {
static $gd_version_number = null;
if ($gd_version_number === null) {
// 使用输出缓冲来获取 phpinfo() 的结果
// 而不影响我们所在的页面。输出
// 缓冲“可堆叠”,因此我们甚至不必
// 担心以前的或包含缓冲。
ob_start();
phpinfo(8);
$module_info = ob_get_contents();
ob_end_clean();
if (preg_match("/\bgd\s+version\b[^\d\n\r]+?([\d\.]+)/i",
$module_info,$matches)) {
$gd_version_number = $matches[1];
} else {
$gd_version_number = 0;
}
}
return $gd_version_number;
}

然后你可以简单地像这样使用它

if (gd_version() >= 2) {
$image = ImageCreateTrueColor($width, $height);
} else {
$image = ImageCreate($width, $height);
}
Hallvord RM Steen <phpnet at hallvord dot com>
20 年前
关于自动选择 TrueColor 或普通版本的 imagecreate,我发现以下内容对我有效

<?php

$newImg
=@ImageCreateTrueColor($width, $height)
or
$newImg=ImageCreate($width, $height);

?>
bjorntje at hotmail dot com
21 年前
我刚摆弄了一下 Phpix,它在使用 GD 库时出现了一些问题
(颜色失真)。
我修改了这行代码,奏效了。
万一你们中一些人仍然遇到问题且
你无法更改 PHP 安装
在托管方

$im = ImageCreateFromJPEG($source);
$new_im = ImageCreate($new_width,$new_height);

ImageCopyResized($new_im,$im,0,0,0,0,
$new_width,$new_height,ImageSX($im),ImageSY($im));



$im = ImageCreateFromJPEG($source);
$new_im = ImageCreateTrueColor($new_width,$new_height);

ImageCopyResized($new_im,$im,0,0,0,0,$new_width,
$new_height,ImageSX($im),ImageSY($im));
Andreas from www.ems-p.de
21 年前
brad at brwebdesign dot com 对 gdlib 的请求不适用于 PHP < 4.1(version_compare)。

一些 phpinfo 版本会在没有空格的情况下提供版本号,所以你最好询问小数点

ob_start();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=strip_tags($phpinfo);
$phpinfo=stristr($phpinfo,"gd version");
$phpinfo=stristr($phpinfo,"version");
$end=strpos($phpinfo,".");
$phpinfo=substr($phpinfo,0,$end);
$length = strlen($phpinfo)-1;
$phpinfo=substr($phpinfo,$length);
if($phpinfo<2){
$dst_img=ImageCreate($new_w,$new_h);}
else {
$dst_img=ImageCreateTrueColor($new_w,$new_h);
}
billet_jerome at yahoo dot fr
21 年前
由于 imagecreatetruecolor 既存在于 gd 中,也存在于 gd2 中,
你无法使用 function_exists 或 get_extension_funcs 来检查 gd2!
但是... imagettfbbox 在 gd 和 gd2 中存在区别
gd 使用像素,而 gd2 使用点。

然后你可以使用此函数来检查 gd2

function sysB_chkgd2()
{

$rep=false;
if(isset($GLOBALS["gBGDVersion"]))
{
$rep=$GLOBALS["gBGDVersion"];
}
else
{
if(function_exists("gd_info"))
{
$gdver=gd_info();
if(strstr($gdver["GD Version"],"1.")!=false)
{
$rep=false;
}
else
{
$rep=true;
}
}
else
{
$size=40;
$font= 你的字体文件路径在此处;
$b=imagettfbbox ($size,0,$font,"abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ");

if(($size+1)<abs($b[5]-$b[3]))
{
$rep=true;
}

}
$GLOBALS["gBGDVersion"]=$rep;
}

return $rep;
}
php at REMOVEreallynicejerk dot com
21 年前
为什么不直接使用 function_exists?

https://php.net/function_exists

仅仅因为他们有 2.0 GD 版本,并不意味着他们没有禁用该功能。

此外,与其确定机器上哪一个,然后编写特定于设置的代码,你还可以编写通用代码在任何一个设置上使用。

伪代码:



if (function_exists(imagecreatetruecolor)){
use imagecreatetruecolor()
}else{
use imagecreate()
}

pmas7354 at artax dot karlin dot mff dot cuni dot cz
22 年前
这里对第一个问题“为什么我需要真彩色图像”提供了答案。

当你想要使用图像(快照)、视频帧等图像时需要真彩色图像。

当你需要为用户组合这些图像或只向他发送你图像的一小部分时,如果尝试使用 256 种颜色,图像会很丑(如果你愿意,可以尝试一下)。某些颜色会发生剧烈变化。

你可能会看到的“抗锯齿”线可能是使用 JPEG 压缩导致的。JPEG 并非无损压缩,因此为了显著减小图像尺寸,会“改变小图像的细节”。在真的真彩色图像(例如你的风景快照等)上,如果使用小压缩级别,你很难发现差异。但在诸如线条、圆圈等使用单色绘制在固定背景上的精确对象上,你可以看到如果你保存并加载此图像,某些细节已被改变。
send at mail dot 2aj dot net
19 年前
感谢 gmail dot com 上的 OverFlow636 和 techie dot com 上的 kuya1284,此功能基于他们的原始编码。

PHP 缺少 imagecreatefromtga 函数,所以我准备了一个简单函数,如果你处理 TGA 图像,可以将其包含到你的库中。除了从 TGA 创建图像外,它还可以输出一个包含图像尺寸的数组(可选),因为 getimagesize() 不能处理 TGA 文件。

希望如果 GD 更新为支持 TGA 格式,此功能最终将不再需要。

请记住,TGA 有许多不同的压缩、颜色设置,因此此功能不能始终如一地正常发挥作用。产生的图像将符合 kuya1284 at techie dot com 提及的症状,因此你可能需要创建第二个函数。请记住,使用她的代码会导致使用以下函数正确加载的图像出现“镜像”效果。

<?php
function imagecreatefromtga ( $filename, $return_array = 0 )
{
$handle = fopen ( $filename, 'rb' );
$data = fread ( $handle, filesize( $filename ) );
fclose ( $handle );

$pointer = 18;
$x = 0;
$y = 0;
$w = base_convert ( bin2hex ( strrev ( substr ( $data, 12, 2 ) ) ), 16, 10 );
$h = base_convert ( bin2hex ( strrev ( substr ( $data, 14, 2 ) ) ), 16, 10 );
$img = imagecreatetruecolor( $w, $h );

while (
$pointer < strlen ( $data ) )
{
imagesetpixel ( $img, $x, $y, base_convert ( bin2hex ( strrev ( substr ( $data, $pointer, 3 ) ) ), 16, 10 ) );
$x++;

if (
$x == $w)
{
$y++;
$x=0;
}

$pointer += 3;
}

if (
$return_array )
return array (
$img, $w, $h );
else
return
$img;
}
?>

示例使用

<?php
// 获取图像及尺寸
$array = imagecreatefromtga("source_image.tga",1);

// 图像 (资源图像)
$image = $array[0];

// 尺寸 (整数)
$dimensions['width'] = $array[1];
$dimensions['height'] = $array[2];

// 删除图像资源数组项以便释放内存
imagedestroy($array[0]);
?>

第二个变量 $return_array 是可选的。如果你仅要加载 TGA,则让该变量离开函数的调用,如下所示
<?
// 仅返回资源图像
$resource_image = imagecreatefromtga ( "source_image.tga" );

// 声明内容类型为 JPEG 图像。
header ( 'Content-type: image/jpeg' );

// 将图像转换成 JPEG 以达到较小的文件体积并提高兼容性
imagejpeg ( $resource_image, NULL, 100 );
imagedestroy ( $resource_image );
?>
behun at webconsult dot sk
17 年前
imagecreatetruecolor() 返回的不仅仅是表示尺寸为 x_size 乘以 y_size 的黑色图像的图像标识符。

调用 imagecreatetruecolor() 旨在创建真彩色图像,该图像包含几乎无限数量的颜色(也不仅仅是 256 色)。
termian
19 年前
kai 写道
//使用 imagecolorallocate 设定图像的背景
//color 不适用于真彩色图像。

//
//相反,你必须使用 imagefill 来强制使用先前分配的

//背景色填充图像
//
//$bgColor = imagecolorallocate($img, 255,255,255);
//imagefill($img , 0,0 , $bgColor);

以下内容对我配置不适用 - fedora core2,php 4.3.8 + 捆绑 gd (兼容 2.0.23),我必须执行此操作
$img = imagecreatetruecolor($x, $y);
$bgColor = imagecolorallocate($img, 255,255,255);
imagefilledrectangle($img, 0, 0, $x-1, $y-1, $bgColor);
hemjesti at yahoo dot com
15 年前
我将这两个示例合并起来并以动态方式生成文本。但借助这一设置,我还能够使用透明背景。

<?php
// Set the content-type

header('Content-type: image/png');

// Create the image
$im = imagecreatetruecolor(175, 15);
imagesavealpha($im, true);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 25, $black);
$trans_colour = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $trans_colour);

// The text to draw
$text = $_GET['text'];
// Replace path by your own font path
$font = 'catriel regular.ttf';

// Add some shadow to the text
imagettftext($im, 9, 0, 13, 16, $black, $font, $text);

// Add the text
imagettftext($im, 9, 0, 12, 15, $white, $font, $text);

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
phpnet at sjeiti dot com
17 年前
对于 '
thomas dot urban at toxa dot de' (2006 年 5 月 23 日 03:28) 有关透明。
示例中的第 3 行返回“参数错误警告”:应该将“imagecolorallocate”替换为“imagecolorallocatealpha”。
(你最好只是更改该注释并删除此注释。)
OverFlow636 at gmail dot com
19 年前
我不知道是否有更简单的完成此操作的方法,但这是我的将 .tga 图像转换为任何想要的输出格式的代码
它仅适用于基本的 tga 文件

<?
$handle = fopen("xxx.tga","rb");
$data = fread($handle,filesize("xxx.tga"));
fclose($handle);
$pointer = 18;
$x = 0;
$y = 0;
$w = fileint(substr($data,12,2));
$h = fileint(substr($data,14,2));
$img = imagecreatetruecolor($w,$h);

while ($pointer < strlen($data))
{
imagesetpixel($img, $x,$y,fileint(substr($data,$pointer,3)));
$x++;

if ($x==$w)
{
$y++;
$x=0;
}

$pointer += 3;
}

header("Content-type: image/jpeg");
imagepng($img);
imagedestroy($img);

function fileint($str)
{
return base_convert(bin2hex(strrev($str)),16,10);
}
?>
brad at brwebdesign dot com
22 年前
我今天想出这个。你需要 GD2.0 或更高版本才能使用 imagecreatetruecolor,这样你就可以解析 phpinfo 以获取所需的信息。在没有上方空格的情况下,它必须放在页面的最上面

<?php
ob_start
();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=strip_tags($phpinfo);
$phpinfo=stristr($phpinfo,"gd version");
$phpinfo=stristr($phpinfo,"version");
$end=strpos($phpinfo," ");
$phpinfo=substr($phpinfo,0,$end);
$phpinfo=substr($phpinfo,7);
if(
version_compare("2.0", "$phpinfo")==1)
echo
"you have a version less then 2";
?>

if 语句适用于 PHP 4.1 或更高版本,但如果你的服务器尚未达到这一 php 版本,你可以使用其他方法来比较版本号
rossa at studioware dot net
22 年前
函数 ConvertGreyscale($image){
# 此文件输出指定图像的灰色版本

$total = ImageColorsTotal($image);
for( $i=0; $i<$total; $i++){
$old = ImageColorsForIndex($image, $i);

#尝试在转换时保持适当的饱和度
$commongrey = (int)(($old[red] + $old[green] + $old[blue]) / 3);

ImageColorSet($image, $i, $commongrey, $commongrey, $commongrey);
}
}
smcjones at gmail dot com
10 年前
请注意,如果你收到了有关 PHP 中错误尺寸的警告,这可能是因为你的值被存储为字符串。你可以使用 intval() 将字符串值更改为整数值,该值将会向此函数中传递正确的信息。
Micke (micke dot prag at newstonight dot net)
21 年前
以下是我为 GD < 2 和 GD > 2 创建图像的解决方案,它们使用的是相同的代码

$dst_img = @imageCreateTrueColor($width, $height);
if (!$dst_img) { $dst_img = imageCreate($width, $height); }
kuya1284 at techie dot com
19 年前
OverFlow636,

你的代码似乎导致 TGA 水平翻转且上下颠倒。我已经相应地修改了你的代码。下面的示例是我为将 tga 转换为 jpg 而采取的操作示例。从下方的注释(Eric Mulders)中取出了 for 循环,以正确地渲染图像。

伙计,干得漂亮。

函数 tga2jpg ($image)
{
$handle = fopen($image, "rb");
$data = fread($handle, filesize($image));
fclose($handle);

$pointer = 18;
$w = fileint (substr ($data, 12, 2));
$h = fileint (substr ($data, 14, 2));
$x = 0;
$y = $h;

$img = imagecreatetruecolor($w, $h);

while ($pointer < strlen($data))
{
imagesetpixel ($img, $x, $y, fileint (substr ($data, $pointer, 3)));

$x++;

if ($x == $w)
{
$y--;
$x = 0;
}

$pointer += 3;
}

for($a = 0; $a < imagecolorstotal ($img); $a++)
{
$color = imagecolorsforindex ($img, $a);

$R=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
$G=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
$B=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);

imagecolorset ($img, $a, $R, $G, $B);
}

imagejpeg ($img, 'test.jpg', 100);
imagedestroy ($img);
}

function fileint($str)
{
return base_convert (bin2hex (strrev ($str)), 16, 10);
}

tga2jpg ('test.tga');
unigram at byair dot net
20 年前
如果你的托管系统没有 imagecreatetruecolor(),因为 PHP<4.2 和 GD<2.0,那么解决方法是

<?
$thumb = imagecreate ($width, $height);
imageJPEG($thumb,"images/temp.jpg");
$thumb = @imagecreatefromjpeg("images/temp.jpg");
?>

它将创建合适大小的缩略图,另存为 jpeg,然后以真彩色读取它。

这纠正了使用调色板图像作为 imagecopyresized () 的目标而造成的降级
thomas dot urban at toxa dot de
18 年前
这是获取最初带透明的真彩色画布的另一种方法,与下面的方法相比,它没有声明黑色是透明的(这在索引颜色图像和在你不想用黑色绘制时也许是合适的)...

$im = imagecreatetruecolor( $w, $h );
imagealphablending( $im, false );
$col = imagecolorallocate( $im, 0, 0, 0, 127 );
imagefilledrectangle( $im, 0, 0, $w, $h, $col );
imagealphablending( $im, true );

如果没有禁用混合模式,它会在当前背景上绘制透明矩形,因此不会改变任何内容。尽管如此,混合模式是必需的,例如,为了从使用 imagettftext 获得正确的结果...这就是为什么在填充后再次启用它。

不要忘记在生成 PNG 之前禁用混合模式并启用 savealpha...

imagealphablending( $im, false );
imagesavealpha( $im, true );
imagepng( $im );
To Top