| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- namespace app\common\library\ps;
- /**
- * 套打纸张尺寸。坐标用相对整张纸的百分比,毫米和像素用来核对原稿是否铺满纸面。
- */
- class PaperSize
- {
- /**
- * @return array name => [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));
- }
- }
|