Php 操纵透明PNG会使图像中的所有rgb(0,0,0)变为透明

Php 操纵透明PNG会使图像中的所有rgb(0,0,0)变为透明,php,image-processing,png,transparency,gd,Php,Image Processing,Png,Transparency,Gd,我有一个PHP图像上传系统,允许用户上传各种图像(JPG、GIF、PNG)。上传的每个图像都有一个图标(20x20)、缩略图(150x150)和一张明信片(500x500),我称之为“元图像”。如果原始图像的尺寸不像元图像那样是方形的,则会将其缩放到最佳匹配,并以适当的尺寸生成透明画布,并将元图像放置在其上。由于这种透明的拉票,以及出于其他目的,所有生成的元图像本身都是PNG(无论原始图像格式如何) 例如,如果用户上载800px x 600px的JPG映像,则文件系统中会出现以下情况: 800

我有一个PHP图像上传系统,允许用户上传各种图像(JPG、GIF、PNG)。上传的每个图像都有一个图标(20x20)、缩略图(150x150)和一张明信片(500x500),我称之为“元图像”。如果原始图像的尺寸不像元图像那样是方形的,则会将其缩放到最佳匹配,并以适当的尺寸生成透明画布,并将元图像放置在其上。由于这种透明的拉票,以及出于其他目的,所有生成的元图像本身都是PNG(无论原始图像格式如何)

例如,如果用户上载800px x 600px的JPG映像,则文件系统中会出现以下情况:

  • 800 x 600的原始*.jpg
  • Meta icon*.png,带有20 x 15份原始图像副本,在20 x 20 tansparent画布上水平和垂直居中
  • Meta thumbail*.png,带有150 x 112份原始图像副本,在150 x 150 tansparent画布上水平和垂直居中
  • Meta icon*.png,带有500 x 375份原始图像副本,在500 x 500 tansparent画布上水平和垂直居中
  • 这非常适合JPG和GIF文件——所有的颜色都处理得很好,大小都很合适,等等

    但是,如果我上传了一个包含任何黑色的PNG(rgb(0,0,0),#000000),那么生成的3个元图像将全部黑色转换为透明。其他一切都是好的——维度等等。记住,透明的GIF似乎工作得很好,即使里面有黑色

    有人能给我解释一下我该如何解决这个问题吗?下面是我为这个系统编写的代码(注意,下面定义了抽象类的3个扩展):

    我不再失去我的黑色,但所有现有的透明度变成黑色

    我假设问题是我使用黑色作为透明通道。但是如何避免使用图像中的颜色作为透明度通道

    感谢所有能帮助我理解透明背后奥秘的人


    Jim

    您明确指定0,0,0是透明的:

    $oTransparentColor = imagecolorallocatealpha( $this->oTransparentCanvas, 0, 0, 0, 127 );
    
    这将适用于图像中颜色三元组为0,0,0的任何像素-换句话说,所有黑色,正如您所发现的


    如果您希望原始图像通过,您可以转换为使用alpha通道。它将是图像中一个单独的“层”,专门指定每个像素的透明度/不透明性。或者扫描原始图像中未使用的颜色,然后将其指定为新的透明值,而不是默认为0,0,0。

    是的,我可能提供了过多的颜色,但我指定了我认为存在问题的特定区域。至少你不用问我密码。。。也就是说,这只是一个345行的文件,其中大部分是评论和文档。你的建议已经过时了,这是我以前读过的东西。我只是不知道怎么做。然而,你让我重新关注我的谷歌搜索,我发现了一些有用的东西。我在前面提到的
    createTarget()
    中留下了大量行,但我在它们之后添加了一个检查,以查看它是否是PNG。如果是,我也会调用
    imagesavealpha($this->oTargetImage,true)我在最后的评论中粗鲁地忘了提到它——谢谢你的时间和帮助。:)
    
    <?php
    ObjectImageRenderer::batchRender( $sSourceFile );
    
    $aTransparentTypes = Array( 'gif', 'png', 'x-png' );
    if( in_array( $this->sSourceExt, $aTransparentTypes ) )
    {
      $oTransparentColor = imagecolorallocate( $this->oTargetImage, 0, 0, 0 );
      imagecolortransparent( $this->oTargetImage, $oTransparentColor);
      imagealphablending( $this->oTargetImage, false );
    }
    
    $oTransparentColor = imagecolorallocatealpha( $this->oTransparentCanvas, 0, 0, 0, 127 );