GD是一个开源代码库,用于程序员动态创建图像。 GD是用C语言编写的,“包装器”可用于Perl,PHP和其他语言。 GD创建PNG,JPEG和GIF图像以及其他格式。 GD通常用于动态生成图表,图形,缩略图和大多数其他内容。虽然不限于在网络上使用,但GD的最常见应用涉及网站开发。
我尝试从数据库生成一个 JPEG 文件,其中包含位于容器中的元素,其中包含坐标(x,y)、大小(宽/高)、x 轴角度和纹理图像。 我已经安装了 GD 扩展...
SO 和网络上其他地方有大量关于当图像位于磁盘上时如何使用 PHP 调整图像大小的答案。但是,如果图像保存在变量中,则这些方法不起作用。我相信...
如何将 imagecropauto() 与 IMG_CROP_TRANSPARENT 一起使用?
当我尝试裁剪图像的透明区域时,它会保持原始大小,并且透明区域会变成黑色。 如果我运行这段代码: 当我尝试裁剪图像的透明区域时,它会保持原始大小,并且透明区域会变成黑色。 如果我运行这段代码: <?php // Create a 300x300px transparant image with a 100px wide red circle in the middle $i = imagecreatetruecolor(300, 300); imagealphablending($i, FALSE); imagesavealpha($i, TRUE); $transparant = imagecolorallocatealpha($i, 0xDD, 0xDD, 0xDD, 0x7F); imagefill($i, 0, 0, $transparant); $red = imagecolorallocate($i, 0xFF, 0x0, 0x0); imagefilledellipse($i, 150, 150, 100, 100, $red); imagepng($i, "red_300.png"); // Crop away transparant parts and save $i2 = imagecropauto($i, IMG_CROP_TRANSPARENT); imagepng($i2, "red_crop_trans.png"); imagedestroy($i2); // Crop away bg-color parts and save $i2 = imagecropauto($i, IMG_CROP_SIDES); imagepng($i2, "red_crop_sides.png"); imagedestroy($i2); // clean up org image imagedestroy($i); 我最终得到了一个red_crop_trans.png图像,它是一个300x300px黑色图像,其中有一个100x100px红色圆圈。 还有一个 red_crop_sides.png,它是一个 100x100px 黑色图像,其中有 100x100px 红色圆圈。 为什么 red_crop_trans.png 没有被裁剪为 100x100px?为什么两个图像的背景都是黑色的?如何在保持透明度的同时裁剪它们? 我花了一段时间才弄清楚到底发生了什么。事实证明 $i2 = imagecropauto($i, IMG_CROP_TRANSPARENT); 返回 false 而不是 true。根据文档: imagecropauto() 在没有任何可裁剪的内容或没有内容时返回 FALSE 整个图像将被裁剪。 所以我用了IMG_CROP_TRANSPARENT代替了IMG_CROP_DEFAULT: 尝试使用 IMG_CROP_TRANSPARENT,如果失败,则会回退到 IMG_CROP_SIDES。 这给了我预期的结果。现在我自己没有得到任何黑色背景。但这是一个已知问题,因此很容易找到解决方案: imagecolortransparent($i, $transparant); // Set background transparent 这让我看到了最终完成的代码: <?php // Create a 300x300px transparant image with a 100px wide red circle in the middle $i = imagecreatetruecolor(300, 300); imagealphablending($i, FALSE); imagesavealpha($i, TRUE); $transparant = imagecolorallocatealpha($i, 0xDD, 0xDD, 0xDD, 0x7F); imagecolortransparent($i, $transparant); // Set background transparent imagefill($i, 0, 0, $transparant); $red = imagecolorallocate($i, 0xFF, 0x0, 0x0); imagefilledellipse($i, 150, 150, 100, 100, $red); imagepng($i, "red_300.png"); // Crop away transparant parts and save $i2 = imagecropauto($i, IMG_CROP_DEFAULT); //Attempts to use IMG_CROP_TRANSPARENT and if it fails it falls back to IMG_CROP_SIDES. imagepng($i2, "red_crop_trans.png"); imagedestroy($i2); // Crop away bg-color parts and save $i2 = imagecropauto($i, IMG_CROP_SIDES); imagepng($i2, "red_crop_sides.png"); imagedestroy($i2); // clean up org image imagedestroy($i); ?> 这里是对这个 IMG_CROP_TRANSPARENT 标志的更详细解释以及它为什么有效和为什么无效。它实际上与函数imagecrop相关,如果你查看php源代码,它有一行非常奇怪的代码,并且正在做类似这样的事情 gdImagePtr gdImageCrop(gdImagePtr src, const gdRectPtr crop) { gdImagePtr dst; int alphaBlendingFlag; if (gdImageTrueColor(src)) { dst = gdImageCreateTrueColor(crop->width, crop->height); } else { dst = gdImageCreate(crop->width, crop->height); } if (!dst) return NULL; alphaBlendingFlag = dst->alphaBlendingFlag; gdImageAlphaBlending(dst, gdEffectReplace); gdImageCopy(dst, src, 0, 0, crop->x, crop->y, crop->width, crop->height); gdImageAlphaBlending(dst, alphaBlendingFlag); return dst; } 找到要裁剪的边缘后,imagecrop 由 imagecropauto 调用。正如您在调用 gdImageCopy 之前所看到的,由于某些未知的原因!!!,开发人员调用了 gdImageAlphaBlending(dst, gdEffectReplace);。它的作用是将 Alpha 颜色替换为黑色。 Alpha 颜色是您在使用 imagecolortransparent 函数时定义的颜色。 所以现在,如果你想使用标志 IMG_CROP_TRANSPARENT,你需要设置 alpha 颜色,因为最初它是“-1”,即使你从 PNG 创建图像。然后该函数将正确裁剪图像,但会用黑色替换透明背景,因为来自 C 源代码的那行代码。所以你不能设置alpha颜色,所以你不能同时使用IMG_CROP_TRANSPARENT。 相反,有效的是使用标志IMG_CROP_SIDES,在C源代码中调用函数gdGuessBackgroundColorFromCorners,我猜它试图在图像边缘找到透明颜色,但会不设置 Alpha 颜色。 现在仍然是个谜,为什么开发人员决定在裁剪时复制图像之前替换 Alpha 颜色。
今天早上进行了相当多的挖掘,但没有看到明显的答案 - 是否可以使用 PHP(或其众多库之一)将图像保存为 pdf 格式? 我相当熟悉...
如何确定 WordPress 使用的是 GD 还是 Imagick?
当从媒体 -> 库 -> 编辑页面调整图像大小时,Wordpress 会生成较低质量的图像。 我在functions.php中使用了以下代码来强制WordPress使用Imagick而不是...
从 alpine 3.13 开始在 php8 中安装 GD 扩展
我在我的 Dockerfile 中添加了以下代码 运行 echo -e "http://nl.alpinelinux.org/alpine/v3.13/main http://nl.alpinelinux.org/alpine/v3.13/community">/etc/apk/repositories; 茹...
使用通过 MacPorts 安装的 GD2 库通过 GCC 编译 C 程序时出现问题
我已经在 Mac 上成功地用 GCC 编译了一个 C 程序,并且直接从源代码安装了 GD2 库。现在我正在尝试使用通过 MacPorts 安装的 GD2 库来做到这一点,并有以下呃...
我在 pngtojpgAction() 下的控制器中有以下代码,我使用 ajax 调用它。 通过这个 $this->getRequest()->getParam('imagedata')); 声明我得到了一个像 t...
想要调整图像大小以将尺寸设置为(1080x1350)而不裁剪,只需用黑色边框/缓冲区填充死角即可。 由于我们无法控制用户上传图像的尺寸和长宽比...
JpGraph:使用 AccBarPlot 时如何控制 v3.5.0b1 中的 x/y 偏移、边距和颜色?
一些背景 我正在尝试将使用 Symfony 1.2 构建的项目从一台服务器迁移到另一台服务器。该项目的功能之一是构建图表(最初是使用 JpGraph 2 完成的......
我尝试过使用GD库来模拟Photoshop的乘法效果,但我还没有找到可行的解决方案。 根据维基百科,乘法混合模式: [...]乘以...
我正在为我的网站制作一个皮肤预览器;我需要旋转图像的某些部分来创建该图像的表示形式以供用户查看。 皮肤是一个PNG文件,它的所有部分可能都是透明的...
我遇到了问题,需要帮助。 我已经制作了一个脚本,用于使用 GD 库使用 PHP 创建图像,但问题是当我在 Firefox 上预览它时,它在
imagecreatefromjpeg 会产生奇怪的损坏且缺少颜色的图像
用于检索和调整图像大小的非常基本的代码会产生损坏的图像,损坏似乎直接从 imagecreatefromjpeg 发生(imagecreatefromstring 产生相同的结果) $图像=
我在 Ubuntu 22.04 上有 PHP 8.1.2 和 Apache 2.4.52,我想我需要 GD 图形扩展才能使我的 PHP 脚本正常工作,但它似乎没有安装和/或启用(没有 GD secti.1)。 ..
我在 IIS 6 上使用 PHP 5.2.0。我想知道我应该做什么来启用 GD Jpeg 支持,我已经在 php.ini 中取消注释了 extension = hp_gd2.dll,但仍然没有得到预期的结果。我是不是漏掉了
注意: 该问题仅针对 PHP GD 库 这个问题不是关于如何将图像裁剪为目标纵横比,而是关于如何绘制延伸到图像之外的覆盖层 我...
无法在 php 8.1.5 docker 容器中为 gd 启用 Freetype
问题:调用未定义的函数 imagettfbbox。 function_exists('imagettfbbox') 的输出为 false。 现在看了这么多Dockerfile,用gd启用Freetype似乎也不是那么难了。嗬...
美好的一天, 在我正在开发的网站中,我想向用户显示使用 来自他的电子邮件地址的哈希值。 我应该生成分形吗? 如果是这样,我怎样才能让他们“...