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"><</a><a class="arrow forward">></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="<a href='addToCart.php?T=Pic?ID=<?php echo $row_rsPictures['PictureID']; ?>' target='_parent' style='color:#fe6d00' >Add This Image To Your Shopping Cart</a><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 代码是它自己的单独文件。出于某种原因,他们将其混为一谈。 我已经完成了该编辑,因为您在这两个文件之间没有明确的分隔符,并且<?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