shish 1 month ago
parent
commit
a8df9d8fda
1 changed files with 21 additions and 17 deletions
  1. 21 17
      common/components/PosterUtil.php

+ 21 - 17
common/components/PosterUtil.php

@@ -14,7 +14,11 @@ class PosterUtil
 
     const POSTER_W = 750;
 
-    const SLOT_W = 700;
+    /** 画布左右留白(各 20px) */
+    const CANVAS_PAD_X = 20;
+
+    /** 商品图显示宽度 = POSTER_W - 2×CANVAS_PAD_X */
+    const SLOT_W = 710;
 
     /** 底部价格/标题/太阳码固定区 */
     const FOOTER_H = 360;
@@ -68,8 +72,8 @@ class PosterUtil
             $scaledH = (int)round($coverHeight * (self::SLOT_W / $coverWidth));
             $imgH = max(self::IMG_H_MIN, min(self::IMG_H_MAX, $scaledH));
         } else {
+            $scaledH = self::IMG_H_MIN;
             $imgH = self::IMG_H_MIN;
-            $scaledH = $imgH;
         }
 
         $totalH = $imgH + self::FOOTER_H;
@@ -85,19 +89,16 @@ class PosterUtil
     }
 
     /**
-     * 短图/扁图:lfit 后 pad;长图:m_fill 裁切进槽位
+     * 商品图:常规按宽 SLOT_W 等比(无左右垫白);超高图用 m_fill 裁高至 IMG_H_MAX
      */
-    private static function buildCoverWatermarkPath($cover, $imgH, $scaledH, $coverWidth, $coverHeight)
+    private static function buildCoverWatermarkPath($cover, $scaledH)
     {
-        $wide = $coverWidth > 0 && $coverHeight > 0 && ($coverWidth / $coverHeight) > 1.15;
-        $shortSlot = $scaledH > 0 && ($scaledH < $imgH || $wide);
-
-        if ($shortSlot) {
-            return $cover . '?x-oss-process=image/resize,m_lfit,h_' . $imgH . ',w_' . self::SLOT_W . ',limit_0'
-                . '/resize,m_pad,h_' . $imgH . ',w_' . self::SLOT_W . ',color_' . self::CANVAS_COLOR;
+        $scaledH = (int)$scaledH;
+        if ($scaledH > self::IMG_H_MAX) {
+            return $cover . '?x-oss-process=image/resize,m_fill,w_' . self::SLOT_W . ',h_' . self::IMG_H_MAX . ',limit_0';
         }
 
-        return $cover . '?x-oss-process=image/resize,m_fill,h_' . $imgH . ',w_' . self::SLOT_W;
+        return $cover . '?x-oss-process=image/resize,m_lfit,w_' . self::SLOT_W . ',limit_0';
     }
 
     /**
@@ -198,7 +199,6 @@ class PosterUtil
         $layout = self::calcPosterLayout($coverW, $coverH);
         $imgH = $layout['imgH'];
         $totalH = $layout['totalH'];
-        $scaledH = $layout['scaledH'];
 
         $displayName = self::truncateText($name, 14);
         if ($flowerNum > 0 && $displayName !== '') {
@@ -207,11 +207,12 @@ class PosterUtil
             $displayName .= ' · ' . self::truncateText($subtitle, 8);
         }
 
-        $coverWatermark = self::buildCoverWatermarkPath($cover, $imgH, $scaledH, $coverW, $coverH);
+        $coverWatermark = self::buildCoverWatermarkPath($cover, $layout['scaledH']);
         $qrWatermark = $miniCode . '?x-oss-process=image/resize,m_fill,h_' . self::QR_SIZE . ',w_' . self::QR_SIZE;
 
         $url = self::buildCanvasBaseUrl($prefix, $totalH);
-        $url .= '/watermark,image_' . stringUtil::ossBase64($coverWatermark) . ',g_north,x_25,y_8';
+        $url .= '/watermark,image_' . stringUtil::ossBase64($coverWatermark)
+            . ',g_nw,x_' . self::CANVAS_PAD_X . ',y_8';
         $url .= '/watermark,image_' . stringUtil::ossBase64($qrWatermark) . ',g_se,x_' . self::QR_PAD_RIGHT . ',y_' . self::QR_PAD_BOTTOM;
 
         $logoB64 = self::buildHyxhLogoWatermark($mainId);
@@ -219,9 +220,12 @@ class PosterUtil
             $url .= '/watermark,image_' . $logoB64 . ',g_se,x_210,y_48';
         }
 
-        $url .= '/watermark,text_' . stringUtil::ossBase64($priceText) . ',g_sw,x_24,y_32,color_EE2C2C,type_' . self::FONT . ',size_56';
-        $url .= '/watermark,text_' . stringUtil::ossBase64($displayName) . ',g_sw,x_24,y_102,color_333333,type_' . self::FONT . ',size_36';
-        $url .= '/watermark,text_' . stringUtil::ossBase64($staffText) . ',g_sw,x_24,y_148,color_999999,type_' . self::FONT . ',size_26';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($priceText)
+            . ',g_sw,x_' . self::CANVAS_PAD_X . ',y_32,color_EE2C2C,type_' . self::FONT . ',size_56';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($displayName)
+            . ',g_sw,x_' . self::CANVAS_PAD_X . ',y_102,color_333333,type_' . self::FONT . ',size_36';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($staffText)
+            . ',g_sw,x_' . self::CANVAS_PAD_X . ',y_148,color_999999,type_' . self::FONT . ',size_26';
         $url .= '/watermark,text_' . stringUtil::ossBase64($scanHint)
             . ',g_south,x_' . self::qrCenterX() . ',y_' . self::scanHintYFromBottom()
             . ',color_888888,type_' . self::FONT . ',size_24';