GD库镜像创建问题

Posted

技术标签:

【中文标题】GD库镜像创建问题【英文标题】:GD Library image creation problem 【发布时间】:2011-05-11 18:41:29 【问题描述】:

我遇到了 gd 库问题。当我使用以下代码时

<script type="text/javascript">

$.fn.infiniteCarousel = function () 

    function repeat(str, num) 
        return new Array( num + 1 ).join( str );
    

    return this.each(function () 
        var $wrapper = $('> div', this).css('overflow', 'hidden'),
            $slider = $wrapper.find('> ul'),
            $items = $slider.find('> li'),
            $single = $items.filter(':first'),

            singleWidth = $single.outerWidth(), 
            visible = Math.ceil($wrapper.innerWidth() / singleWidth), // note: doesn't include padding or border
            currentPage = 1,
            pages = Math.ceil($items.length / visible);            


        // 1. Pad so that 'visible' number will always be seen, otherwise create empty items
        if (($items.length % visible) != 0) 
            $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
            $items = $slider.find('> li');
        

        // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
        $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));
        $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
        $items = $slider.find('> li'); // reselect

        // 3. Set the left position to the first 'real' item
        $wrapper.scrollLeft(singleWidth * visible);

        // 4. paging function
        function gotoPage(page) 
            var dir = page < currentPage ? -1 : 1,
                n = Math.abs(currentPage - page),
                left = singleWidth * dir * visible * n;

            $wrapper.filter(':not(:animated)').animate(
                scrollLeft : '+=' + left
            , 500, function () 
                if (page == 0) 
                    $wrapper.scrollLeft(singleWidth * visible * pages);
                    page = pages;
                 else if (page > pages) 
                    $wrapper.scrollLeft(singleWidth * visible);
                    // reset back to start position
                    page = 1;
                 

                currentPage = page;
            );                

            return false;
        

        $wrapper.after('<a class="arrow back">&lt;</a><a class="arrow forward">&gt;</a>');

        // 5. Bind to the forward and back buttons
        $('a.back', this).click(function () 
            return gotoPage(currentPage - 1);                
        );

        $('a.forward', this).click(function () 
            return gotoPage(currentPage + 1);
        );

        // create a public interface to move to a specific page
        $(this).bind('goto', function (event, page) 
            gotoPage(page);
        );
    );  
;

$(document).ready(function () 
  $('.infiniteCarousel').infiniteCarousel();

  $("a.pictureThumb").fancybox(
        'autoScale'     : true,
        'autoDimension' : true,
        'transitionIn'  :   'elastic',
        'transitionOut' :   'elastic',
        'speedIn'       :   300, 
        'speedOut'      :   200, 
        'hideOnOverlayClick' : true, 
        'hideOnContentClick': false 
    );
);
</script>

有了这个作为图像生成器,唯一的结果就是看起来像编程代码而不是图像。该脚本使用不同的滚动条,但由于我放置了这个新滚动条脚本(见上图),我在生成图像时遇到了问题(IE 它只显示加载图标),FireFox 实际上显示了编程代码。

下面是调用 GD 函数的代码:

<div class="infiniteCarousel">
  <div class="wrapper">
        <ul>
          <?php 
      do  ?>
          <li><a class="pictureThumb" href="picture.php?imgID=<?php $pieces = explode('_', $row_rsPictures['PictureFile']); echo $pieces[0]."_".$pieces[1]."_".$pieces[2]; if ($pieces[3] == "NN") echo "_NN_".$pieces[4]."_".$pieces[5];;  else  echo "_".$pieces[3]."_".$pieces[4];  ?>&thumb=Y" title="&lt;a href=&#x27;addToCart.php?T=Pic?ID=<?php echo $row_rsPictures['PictureID']; ?>&#x27; target=&#x27;_parent&#x27; style=&#x27;color:#fe6d00&#x27;  &gt;Add This Image To Your Shopping Cart&lt;/a&gt;<br><?php echo $row_rsPictures['BoatName'];if($row_rsPictures['BoatNumber'] != "") 
                                     echo " #".$row_rsPictures['BoatNumber'];
                                      ?><br>driven by: <?php echo $row_rsPictures['DriverName']; ?> at the <?php
                  $AssocName_array = explode('_', $row_rsPictures['Acronym']);
                  $AssocName = $AssocName_array[0];
                  if ($AssocName == "Various") 
                    $AssocName = "";
                                
                  if ($row_rsPictures['DateTo'] != "")
                  $EventYear = date("Y", strtotime($row_rsPictures['DateTo']));
                  
                    else  $EventYear = "";
                    
                  echo $EventYear." ".$AssocName." ".$row_rsPictures['EventName'];?><br>Picture Viewed (<?php echo $row_rsPictures['Views']; ?>) since posted on <?php echo date("n-j-Y", strtotime($row_rsPictures['DatePosted'])); ?>" rel="group">
            <img src="../images/gallery/<?php $raceYear = explode('_', $row_rsPictures['EventOverlay']); echo $raceYear[0]; ?>/<?php echo $row_rsPictures['EventOverlay']; ?>/thumb/<?php echo $row_rsPictures['PictureFile']; ?>.jpg" ></a></li>
          <?php  
           while ($row_rsPictures = mysql_fetch_assoc($rsPictures));
          mysql_data_seek($rsPictures, 0);
          ?>
        </ul>
      </div>
  </div>

以及生成图像的单独 php 文件。

<?php  
$filename = explode("_", $_GET['imgID']);
$folder = $filename[0];
$subFolder = $filename[0]."_".$filename[1]."_".$filename[2];
if($filename[3] == "NN") 
    $subFolder = $subFolder."_NN";
    
$shot = "../images/gallery/".$folder."/".$subFolder."/".$_GET['imgID'].".jpg";
$watermark = "../images/gallery/watermark.png";

header("Content-type: image/jpg");
$photoImage = ImageCreateFromJPEG($shot); 
ImageAlphaBlending($photoImage, true); 
$logoImage2 = ImageCreateFromPNG($watermark);

$im = imagecreatetruecolor(800, 16);
$im2 = imagecreatetruecolor(800, 10);
$white = imagecolorallocate($im, 255, 255, 255);
//imagefilledrectangle($photoImage, 0, 0, 796, 15, $white);
$grey = imagecolorallocate($im2, 128, 128, 128);
$red = imagecolorallocate($im2, 255, 0, 0);
//$im = imagecreatetruecolor(796, 25);
$text = $_GET['imgID'];
$text2 = 'COPYRIGHT 1997 - 2011 - DRAGBOATS.COM - ALL RIGHTS RESERVED';
$text3 = '^ THIS BAR WILL NOT APPEAR ON PURCHASED PRINTS ^';
//$black = imagecolorallocate($photoImage, 0, 0, 0);
imagestring($im, 2, 10, 1, $text, $white);
imagestring($im, 2, 440, 1, $text2, $white);
imagestring($im2, 1, 290, 1, $text3, $white);

ImageCopy($photoImage, $im, 0, 0, 0, 0, 800, 16);
ImageCopy($photoImage, $im2, 0, 17, 0, 0, 800, 10);
ImageCopy($photoImage, $logoImage2, 0, 0, 0, 0, 800, 525); 

ImageJPEG($photoImage); // output to browser 

ImageDestroy($photoImage); 
ImageDestroy($logoImage2);
?>

某处存在导致问题的冲突,我找不到它。

感谢任何帮助。

实际页面可以在http://randykrohn.com/gallery/pictures_test.php?BoatID=881找到

【问题讨论】:

不确定是否是问题所在,但您的 JPG 内容类型标题应为 image/jpeg,注意 e 不,这似乎没有任何区别 【参考方案1】:

您似乎正在将原始图像数据(.jpg 中的字节)文件输出到画廊弹出窗口中,并带有不适当的标题,因此 imgae 被解释为文本而不是图像。

如果“...调用 GD 函数”下的最后一段代码都在一个文件中,那就可以解释原因了。您正在输出一段 html,然后是原始图像数据,然后将其插入到图库弹出窗口中。 Content-type 标头无法生效,因为您已经输出了一些 html。如果您检查错误日志(和/或实际启用错误/警告),您无疑会看到来自 PHP 的常见“无法修改标头,输出从第 XXX 行开始”警告。

【讨论】:

版主一定修改了帖子。这个 php 代码是它自己的单独文件。出于某种原因,他们将其混为一谈。 我已经完成了该编辑,因为您在这两个文件之间没有明确的分隔符,并且 &lt;?php 部分超出了代码格式。我现在已经明确地把它分开了。 好的,很抱歉。我只是对其进行了一些编辑以使其更加清晰。谢谢!【参考方案2】:

尝试在php.ini 文件中将 php 内存限制设置为 96M(推荐 128M)。如果您无权访问该文件,只需将 ini_set('memory_limit', '128M'); 添加到您的 php 文件中。它必须有助于解决问题。

【讨论】:

没有帮助,但我自己想通了。需要告诉 FancyBox 以图像形式显式打开链接(即:fancybox('type' : 'image'); 现在一切都好!谢谢你们的帮助!【参考方案3】:

没有帮助,但我自己想通了。需要告诉 FancyBox 以图片形式显式打开链接(即:fancybox('type' : 'image'); 现在一切顺利!谢谢大家的帮助!

【讨论】:

您可以接受自己问题的答案。这样做是为了帮助其他人

以上是关于GD库镜像创建问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 codeigniter 进行图像裁剪,没有 GD 库 - 安装了 GD2

php笔记之GD库图片创建/简单验证码

PHP GD 库质量下降。其他想法?

通过 PHP 的GD库创建一个简单的图片

在 PHP 中,如何直接在我的网站上使用 GD 库创建的图像

PHP系列GD库