[w_mm, h_mm, px_w@300dpi, px_h@300dpi] */ public static function presets() { return [ 'A4' => [ 'label' => 'A4(210 × 297 mm)', 'w' => 210, 'h' => 297, 'dpi' => 300, ], 'A5' => [ 'label' => 'A5(148 × 210 mm)', 'w' => 148, 'h' => 210, 'dpi' => 300, ], 'custom' => [ 'label' => '自定义毫米', 'w' => 210, 'h' => 297, 'dpi' => 300, ], ]; } /** * 300DPI 下的建议像素(整数)。 * @param float $mmW * @param float $mmH * @param int $dpi * @return array */ public static function pixels($mmW, $mmH, $dpi = 300) { $dpi = $dpi > 0 ? (int)$dpi : 300; return [ 'w' => (int)round($mmW / 25.4 * $dpi), 'h' => (int)round($mmH / 25.4 * $dpi), 'dpi' => $dpi, ]; } /** * @param string $name * @param float $w * @param float $h * @return array */ public static function resolve($name, $w = 0, $h = 0) { $name = strtoupper(trim((string)$name)); if ($name === 'CUSTOM' || $name === '自定义') { $name = 'custom'; } $presets = self::presets(); if ($name === 'A5') { $out = $presets['A5']; $out['name'] = 'A5'; } elseif ($name === 'CUSTOM' || $name === 'custom') { $out = $presets['custom']; $out['name'] = 'custom'; if ((float)$w > 0) { $out['w'] = (float)$w; } if ((float)$h > 0) { $out['h'] = (float)$h; } } else { $out = $presets['A4']; $out['name'] = 'A4'; } if ($out['w'] <= 0 || $out['h'] <= 0) { $out['w'] = 210; $out['h'] = 297; $out['name'] = 'A4'; } $px = self::pixels($out['w'], $out['h'], (int)$out['dpi']); $out['px_w'] = $px['w']; $out['px_h'] = $px['h']; return $out; } /** * 图片高宽比与纸张是否一致(扫描裁切允许少量偏差)。 * @param int $imgW * @param int $imgH * @param float $mmW * @param float $mmH * @param float $tolerance * @return bool */ public static function ratioMatches($imgW, $imgH, $mmW, $mmH, $tolerance = 0.04) { if ($imgW < 10 || $imgH < 10 || $mmW <= 0 || $mmH <= 0) { return false; } $imgRatio = $imgH / $imgW; $paperRatio = $mmH / $mmW; return abs($imgRatio - $paperRatio) / $paperRatio <= $tolerance; } /** * 按纸张毫米反推当前图的 DPI(取宽边)。 * @param int $imgW * @param float $mmW * @return int */ public static function dpiOf($imgW, $mmW) { if ($imgW < 1 || $mmW <= 0) { return 0; } return (int)round($imgW / ($mmW / 25.4)); } }