找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1231|回复: 0

[分享] 原创dedecms缩略图系列教程:解决dedecms缩略图缩放变形问题

[复制链接]
发表于 2018-7-26 09:15:07 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
背景:dedecms生成缩略图的原理不够灵活导致缩略图变形,比如后台设置缩略图的尺码为:120*90即为3:2的图片,但是假如内容里的大图尺码为300*300即1:1,这样生成出来的图片就会变形,严重影响网站美观,本文介绍通过修改dedecms生成缩略源码方法解决定问题
打开“include/image.func.php”文件,该文件在dedecms5.6,5.7中所在的目录不一样,5.6中文件在/include/下,5.7中文件在/include/helpers/,如果你懒的找可以直接在网站根目录搜索image.func.php文件
如果你使用的是dedecms5.7,打开目录/include/helpers/找到image.helper.php文件
如果你使用的是dedecms5.6,打开目录/include/找到image.func.php文件
5.7版image.helper.php修改方法
替换
/**
*  缩图片自动生成函数,来源支持bmp、gif、jpg、png
*  但生成的小图只用jpg或png格式
*
* @access    public
* @param     string  $srcFile  图片路径
* @param     string  $toW  转换到的宽度
* @param     string  $toH  转换到的高度
* @param     string  $toFile  输出文件到
* @return    string
*/

/**
*  获得GD的版本
*
* @access    public
* @return    int
*/
中间的代码为:
  1. if ( ! function_exists('ImageResize'))
  2. {
  3.     function ImageResize($srcFile,$toW,$toH,$toFile="")
  4. {
  5. global $cfg_photo_type;
  6. if($toFile=="")
  7. {
  8.    $toFile = $srcFile;
  9. }
  10. $info = "";
  11. $srcInfo = GetImageSize($srcFile,$info);
  12. switch ($srcInfo[2])
  13. {
  14.    case 1:
  15.     if(!$cfg_photo_type['gif'])
  16.     {
  17.      return false;
  18.     }
  19.     $im = imagecreatefromgif($srcFile);
  20.     break;
  21.    case 2:
  22.     if(!$cfg_photo_type['jpeg'])
  23.     {
  24.      return false;
  25.     }
  26.     $im = imagecreatefromjpeg($srcFile);
  27.     break;
  28.    case 3:
  29.     if(!$cfg_photo_type['png'])
  30.     {
  31.      return false;
  32.     }
  33.     $im = imagecreatefrompng($srcFile);
  34.     break;
  35.    case 6:
  36.     if(!$cfg_photo_type['bmp'])
  37.     {
  38.      return false;
  39.     }
  40.     $im = imagecreatefromwbmp($srcFile);
  41.     break;
  42. }
  43. $srcW=ImageSX($im);
  44. $srcH=ImageSY($im);
  45. if($srcW<=$toW&#160;&&&#160;$srcH<=$toH&#160;)
  46. {
  47. &#160;&#160;&#160;return&#160;true;
  48. }
  49. //缩略生成并裁剪
  50. $newW&#160;=&#160;$toH&#160;*&#160;$srcW&#160;/&#160;$srcH;
  51. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$newH&#160;=&#160;$toW&#160;*&#160;$srcH&#160;/&#160;$srcW;
  52. if($newH&#160;>=&#160;$toH)
  53. {
  54. &#160;&#160;&#160;$ftoW&#160;=&#160;$toW;
  55. &#160;&#160;&#160;$ftoH&#160;=&#160;$newH;
  56. }
  57. else
  58. {
  59. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$ftoW&#160;=&#160;$newW;
  60. &#160;&#160;&#160;$ftoH&#160;=&#160;$toH;
  61. }
  62. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if($srcW>$toW||$srcH>$toH)
  63. {
  64. &#160;&#160;&#160;if(function_exists("imagecreatetruecolor"))
  65. &#160;&#160;&#160;{
  66. &#160;&#160;&#160;&#160;@$ni&#160;=&#160;imagecreatetruecolor($ftoW,$ftoH);
  67. &#160;&#160;&#160;&#160;if($ni)
  68. &#160;&#160;&#160;&#160;{
  69. &#160;&#160;&#160;&#160;&#160;imagecopyresampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  70. &#160;&#160;&#160;&#160;}
  71. &#160;&#160;&#160;&#160;else
  72. &#160;&#160;&#160;&#160;{
  73. &#160;&#160;&#160;&#160;&#160;$ni=imagecreate($ftoW,$ftoH);
  74. &#160;&#160;&#160;&#160;&#160;imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  75. &#160;&#160;&#160;&#160;}
  76. &#160;&#160;&#160;}
  77. &#160;&#160;&#160;else
  78. &#160;&#160;&#160;{
  79. &#160;&#160;&#160;&#160;$ni=imagecreate($ftoW,$ftoH);
  80. &#160;&#160;&#160;&#160;imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  81. &#160;&#160;&#160;}
  82. &#160;&#160;&#160;//裁剪图片成标准缩略图
  83. &#160;&#160;&#160;$new_imgx&#160;=&#160;imagecreatetruecolor($toW,$toH);
  84. &#160;&#160;&#160;if($newH&#160;>=&#160;$toH)
  85. &#160;&#160;&#160;{
  86. &#160;&#160;&#160;&#160;imagecopyresampled($new_imgx,$ni,0,0,0,($newH&#160;-&#160;$toH)/2,$toW,$toH,$toW,$toH);
  87. &#160;&#160;&#160;}
  88. &#160;&#160;&#160;else
  89. &#160;&#160;&#160;{
  90. &#160;&#160;&#160;&#160;imagecopyresampled($new_imgx,$ni,0,0,($newW&#160;-&#160;$toW)/2,0,$toW,$toH,$toW,$toH);
  91. &#160;&#160;&#160;}
  92. &#160;&#160;&#160;switch&#160;($srcInfo[2])
  93. &#160;&#160;&#160;{
  94. &#160;&#160;&#160;&#160;case&#160;1:
  95. &#160;&#160;&#160;&#160;&#160;imagegif($new_imgx,$toFile);
  96. &#160;&#160;&#160;&#160;&#160;break;
  97. &#160;&#160;&#160;&#160;case&#160;2:
  98. &#160;&#160;&#160;&#160;&#160;imagejpeg($new_imgx,$toFile,85);
  99. &#160;&#160;&#160;&#160;&#160;break;
  100. &#160;&#160;&#160;&#160;case&#160;3:
  101. &#160;&#160;&#160;&#160;&#160;imagepng($new_imgx,$toFile);
  102. &#160;&#160;&#160;&#160;&#160;break;
  103. &#160;&#160;&#160;&#160;case&#160;6:
  104. &#160;&#160;&#160;&#160;&#160;imagebmp($new_imgx,$toFile);
  105. &#160;&#160;&#160;&#160;&#160;break;
  106. &#160;&#160;&#160;&#160;default:
  107. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  108. &#160;&#160;&#160;}
  109. &#160;&#160;&#160;imagedestroy($new_imgx);
  110. &#160;&#160;&#160;imagedestroy($ni);
  111. }
  112. imagedestroy($im);
  113. return&#160;true;
  114. }
  115. }
复制代码

修改好后保存文件即可,赶紧添加个带图片的文章试试吧,如果你不愿意修改可直接
5.6版image.func.php修改方法
替换
//缩图片自动生成函数,来源支持bmp、gif、jpg、png

//获得GD的版本
中间的代码为:
  1. function&#160;ImageResize($srcFile,$toW,$toH,$toFile="")
  2. {
  3. global&#160;$cfg_photo_type;
  4. if($toFile=="")
  5. {
  6. &#160;&#160;&#160;$toFile&#160;=&#160;$srcFile;
  7. }
  8. $info&#160;=&#160;"";
  9. $srcInfo&#160;=&#160;GetImageSize($srcFile,$info);
  10. switch&#160;($srcInfo[2])
  11. {
  12. &#160;&#160;&#160;case&#160;1:
  13. &#160;&#160;&#160;&#160;if(!$cfg_photo_type['gif'])
  14. &#160;&#160;&#160;&#160;{
  15. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  16. &#160;&#160;&#160;&#160;}
  17. &#160;&#160;&#160;&#160;$im&#160;=&#160;imagecreatefromgif($srcFile);
  18. &#160;&#160;&#160;&#160;break;
  19. &#160;&#160;&#160;case&#160;2:
  20. &#160;&#160;&#160;&#160;if(!$cfg_photo_type['jpeg'])
  21. &#160;&#160;&#160;&#160;{
  22. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  23. &#160;&#160;&#160;&#160;}
  24. &#160;&#160;&#160;&#160;$im&#160;=&#160;imagecreatefromjpeg($srcFile);
  25. &#160;&#160;&#160;&#160;break;
  26. &#160;&#160;&#160;case&#160;3:
  27. &#160;&#160;&#160;&#160;if(!$cfg_photo_type['png'])
  28. &#160;&#160;&#160;&#160;{
  29. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  30. &#160;&#160;&#160;&#160;}
  31. &#160;&#160;&#160;&#160;$im&#160;=&#160;imagecreatefrompng($srcFile);
  32. &#160;&#160;&#160;&#160;break;
  33. &#160;&#160;&#160;case&#160;6:
  34. &#160;&#160;&#160;&#160;if(!$cfg_photo_type['bmp'])
  35. &#160;&#160;&#160;&#160;{
  36. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  37. &#160;&#160;&#160;&#160;}
  38. &#160;&#160;&#160;&#160;$im&#160;=&#160;imagecreatefromwbmp($srcFile);
  39. &#160;&#160;&#160;&#160;break;
  40. }
  41. $srcW=ImageSX($im);
  42. $srcH=ImageSY($im);
  43. if($srcW<=$toW&#160;&&&#160;$srcH<=$toH&#160;)
  44. {
  45. &#160;&#160;&#160;return&#160;true;
  46. }
  47. //缩略生成并裁剪
  48. $newW&#160;=&#160;$toH&#160;*&#160;$srcW&#160;/&#160;$srcH;
  49. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$newH&#160;=&#160;$toW&#160;*&#160;$srcH&#160;/&#160;$srcW;
  50. if($newH&#160;>=&#160;$toH)
  51. {
  52. &#160;&#160;&#160;$ftoW&#160;=&#160;$toW;
  53. &#160;&#160;&#160;$ftoH&#160;=&#160;$newH;
  54. }
  55. else
  56. {
  57. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$ftoW&#160;=&#160;$newW;
  58. &#160;&#160;&#160;$ftoH&#160;=&#160;$toH;
  59. }
  60. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if($srcW>$toW||$srcH>$toH)
  61. {
  62. &#160;&#160;&#160;if(function_exists("imagecreatetruecolor"))
  63. &#160;&#160;&#160;{
  64. &#160;&#160;&#160;&#160;@$ni&#160;=&#160;imagecreatetruecolor($ftoW,$ftoH);
  65. &#160;&#160;&#160;&#160;if($ni)
  66. &#160;&#160;&#160;&#160;{
  67. &#160;&#160;&#160;&#160;&#160;imagecopyresampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  68. &#160;&#160;&#160;&#160;}
  69. &#160;&#160;&#160;&#160;else
  70. &#160;&#160;&#160;&#160;{
  71. &#160;&#160;&#160;&#160;&#160;$ni=imagecreate($ftoW,$ftoH);
  72. &#160;&#160;&#160;&#160;&#160;imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  73. &#160;&#160;&#160;&#160;}
  74. &#160;&#160;&#160;}
  75. &#160;&#160;&#160;else
  76. &#160;&#160;&#160;{
  77. &#160;&#160;&#160;&#160;$ni=imagecreate($ftoW,$ftoH);
  78. &#160;&#160;&#160;&#160;imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  79. &#160;&#160;&#160;}
  80. &#160;&#160;&#160;//裁剪图片成标准缩略图
  81. &#160;&#160;&#160;$new_imgx&#160;=&#160;imagecreatetruecolor($toW,$toH);
  82. &#160;&#160;&#160;if($newH&#160;>=&#160;$toH)
  83. &#160;&#160;&#160;{
  84. &#160;&#160;&#160;&#160;imagecopyresampled($new_imgx,$ni,0,0,0,($newH&#160;-&#160;$toH)/2,$toW,$toH,$toW,$toH);
  85. &#160;&#160;&#160;}
  86. &#160;&#160;&#160;else
  87. &#160;&#160;&#160;{
  88. &#160;&#160;&#160;&#160;imagecopyresampled($new_imgx,$ni,0,0,($newW&#160;-&#160;$toW)/2,0,$toW,$toH,$toW,$toH);
  89. &#160;&#160;&#160;}
  90. &#160;&#160;&#160;switch&#160;($srcInfo[2])
  91. &#160;&#160;&#160;{
  92. &#160;&#160;&#160;&#160;case&#160;1:
  93. &#160;&#160;&#160;&#160;&#160;imagegif($new_imgx,$toFile);
  94. &#160;&#160;&#160;&#160;&#160;break;
  95. &#160;&#160;&#160;&#160;case&#160;2:
  96. &#160;&#160;&#160;&#160;&#160;imagejpeg($new_imgx,$toFile,85);
  97. &#160;&#160;&#160;&#160;&#160;break;
  98. &#160;&#160;&#160;&#160;case&#160;3:
  99. &#160;&#160;&#160;&#160;&#160;imagepng($new_imgx,$toFile);
  100. &#160;&#160;&#160;&#160;&#160;break;
  101. &#160;&#160;&#160;&#160;case&#160;6:
  102. &#160;&#160;&#160;&#160;&#160;imagebmp($new_imgx,$toFile);
  103. &#160;&#160;&#160;&#160;&#160;break;
  104. &#160;&#160;&#160;&#160;default:
  105. &#160;&#160;&#160;&#160;&#160;return&#160;false;
  106. &#160;&#160;&#160;}
  107. &#160;&#160;&#160;imagedestroy($new_imgx);
  108. &#160;&#160;&#160;imagedestroy($ni);
  109. }
  110. imagedestroy($im);
  111. return&#160;true;
  112. }
复制代码

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-26 09:04 , Processed in 0.043903 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表