ãœãŒã·ã£ã«ãããã¯ãŒã¯ã¯éèŠãªãã©ãã£ãã¯ã®ãœãŒã¹ã§ãã ãŠãŒã¶ãŒãã³ã³ãã³ããå
±æããããšã¯ç§ãã¡ã«ãšã£ãŠæçã§ããããŠãŒã¶ãŒã«ãã®æ©äŒãäžããŸããå
±æã§ããã³ã³ãã³ãã«ã¯ããã€ãã®çš®é¡ããããŸãã
- ããªãã®ãããã£ãŒã«;
- ä»ã®èª°ãã®ãããã¡ã€ã«ïŒææè
ãèš±å¯ããå ŽåïŒ;
- ãµã€ãã§ã®ãŠãŒã¶ãŒã®äººæ°ãåæ ããè©äŸ¡ã
- ãŠãŒã¶ãŒã®è¡åãŸãã¯ä»ã®ãŠãŒã¶ãŒã®è¡åã«å¯ŸããŠåãåã£ãå ±é
‹
ãŠãŒã¶ãŒã«ããããã¹ãŠå
±æãããããšæãããã«ããããžãšåŒã°ããç¹å¥ãªç»åãçæããŸãã ãŠãŒã¶ãŒãååŸã§ãããããžã®äŸã次ã«ç€ºããŸãã

ãããžã®ç¹åŸŽã¯ããŠãŒã¶ãŒèªèº«ã®åçãå«ãŸããŠããããã誰ãããŠããŒã¯ãªç»åãèŠããå
±æãããããããšã§ãã ãã®èšäºã§ã¯ããã®ãããªç»åã®çææ¹æ³ãééããåé¡ãããã³ãããã®è§£æ±ºæ¹æ³ã«ã€ããŠèª¬æããŸãã
ç»åçæ
ãœãŒã·ã£ã«ãããã¯ãŒã¯ããã®ãŠãŒã¶ãŒãŸãã¯ãããã®ãªã¯ãšã¹ãã«å¿ããŠããªã¢ã«ã¿ã€ã ãããžã®ç»åãçæããŸãã äºåã«èª¿çããããšã¯ã§ããŸãã ããã«ã¯ãå¿
èŠãªãã¹ãŠã®ã€ã¡ãŒãžãå®å
šã«çæããããã«å€§éã®ã¹ãã¬ãŒãžã¹ããŒã¹ãšãµãŒããŒãªãœãŒã¹ãå¿
èŠã«ãªããŸãïŒãã ããå®éã«å¿
èŠã«ãªããšããäºå®ã§ã¯ãããŸããïŒã
çæã¹ããŒã ã®åºç€ãšããŠãç§ãã¡ã®åçãæ©èœãããã®ãæ¡çšããŸãããããããã«å€æŽããŸããã ãµãŒããŒã®èŠ³ç¹ããèŠããšãçæã¯æ¬¡ã®ãšããã§ãã

- ãããžçæã®ããã®HTTPãªã¯ãšã¹ããPhotocacheãµãŒããŒã«å°çããŸãããã®ç®çã¯ããªã¯ãšã¹ããåãå
¥ããã¬ã¹ãã³ã¹ãã£ãã·ã¥ãä¿åããããšã§ã
- ããã«ãããåçèªäœãä¿åãããµãŒããŒã®è² è·ã軜æžããŸãã
- Photocacheã®nginxã¯ããã£ãã·ã¥å
ã®ç»åãæ¢ããããããã°ãã¯ã©ã€ã¢ã³ãã«æäŸããŸãã ããã§ã¯ããããžã®æåã®éãã衚瀺ãããŸãã ãªã¯ãšã¹ãã¯æ¯èŒçå°ãªããããã§ã¯æšæºã®nginxãã£ãã·ã¥ã䜿çšãããŸããéåžžã®åçã䜿çšããå Žåã®ããã«ãèªå·±äœæã¢ãžã¥ãŒã«ã§ã¯ãããŸããã
- ãã£ãã·ã¥ã«äœããªãå Žåããªã¯ãšã¹ãã¯Bphotos-ãããžãçæãããŠãŒã¶ãŒã®åçãä¿åãããŠãããµãŒããŒã«ãããã·ãããŸãã
- Bphotosã®nginxã¯ãªã¯ãšã¹ããPHPã¹ã¯ãªããã«æž¡ããŸããPHPã¹ã¯ãªããã¯å¿
èŠãªãã¹ãŠã®ãªãœãŒã¹ãããŒãããçæãéå§ããŠå®æããã€ã¡ãŒãžãæäŸããŸãã ããã2çªç®ã®éãã§ããnginxã¯ãPHPã¹ã¯ãªããã®å©ããåããã«ã«ã¹ã¿ã ãŠãŒã¶ãŒã®åçãæäŸããŸãã
- Photocacheã¯åä¿¡ãããããžç»åãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããã£ãã·ã¥ããŸãã
ãããžã®åã¿ã€ãã«ã¯ç¬èªã®URL圢åŒããããçæã«å¿
èŠãªãŠãŒã¶ãŒã®åçããã®ä»ã®ãªãœãŒã¹ïŒè³ãªã©ïŒã®èå¥åãå«ãŸããŸãã æ£ãããµãŒããŒãžã®ãªã¯ãšã¹ãã®è»¢éã«åœ±é¿ãããµãŒãã¹ãã©ã¡ãŒã¿ã ãã®ãããžãçæãããèšèªãšãœãŒã·ã£ã«ãããã¯ãŒã¯ã®ã³ãŒãã
Badooã¯è€æ°ã®èšèªã«ããŒã«ã©ã€ãºããããããžã§ã¯ãã§ãããããURLã®èšèªã³ãŒãã¯éåžžã«éèŠã§ãã éåžžã®ã¯ãšãªã§ã¯ãçŸåšã®ãŠãŒã¶ãŒã®èšå®ã«åºã¥ããããŒã«ã©ã€ãºãªããžã§ã¯ãã䜿çšããŠããŒã¯ã³ãååŸããŸãã ãããžã§ã¯ãããã¯æ©èœããŸããã ãªã¯ãšã¹ãã®çŽ3åã®1ã¯ãœãŒã·ã£ã«ãããã¯ãŒã¯ã®ãããããéä¿¡ãããŸãããããã¯ãã·ã¹ãã ãäžæ£ãŠãŒã¶ãŒãšããŠåŠçããIPã¢ãã¬ã¹ã«ãã£ãŠèšèªãæšæž¬ããããšããŸãã æåã¯ããã«ã€ããŠã¯èããŠããŸããã§ããããç§ãã¡ã®ãŠã§ããµã€ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã§ããŠãŒã¶ãŒã1ã€ã®èšèªã®ããã¹ããå«ãç»åãèŠãŠãFacebookã«è¿œå ããŠãè±èªã®ããã¹ããå«ãç»åãèŠãŸããã
ãœãŒã·ã£ã«ãããã¯ãŒã¯ã«ã¯ç»åãµã€ãºã®å¥œã¿ãç°ãªãããããœãŒã·ã£ã«ãããã¯ãŒã¯ã³ãŒããå¿
èŠã§ãã ããšãã°ãFacebookã«ã¯1200x630ã®åçãå¿
èŠã§ãInstagramã«ã¯640x640ã®åçãå¿
èŠã§ãã 誰ã«å¯ŸããŠç»åãçæããŠããã®ããããã£ãŠããå Žåãåä¿¡è
ã«é©å¿ã§ããŸãã

ããã«å ããŠãéåžžãURLã®äžéšãå€æŽã®ããããã¹ã¯ã®äžã«çœ®ããŸããããã¯ããžã§ãã¬ãŒã¿ãŒã®äžéšã®æ©èœãäžéšã®å Žåã«ã®ã¿å«ããå¿
èŠãããå Žåã«äœ¿çšãããŸãã ããšãã°ãAppleãiOSã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã®è©äŸ¡ã§åçãé
åžããªãããã«èŠæ±ãããšãã«ããã®ãã£ãŒã«ãã䜿çšããŸããã 次ã«ãã¬ãŒãã£ã³ã°ãé衚瀺ã«ãããã©ã°ãè¿œå ããŸãããããã«ãããäžæ¹ã§ã¯Appleãšå£è«ããããšãªããå¯èœãªå Žåã¯æ¢åã®ãããžãæ®ãããšãã§ããŸããã ãã®ãã£ãŒã«ããªãã§ãå®è¡ã§ããŸããããããžã®å€æŽãããããŒãžã§ã³ããšã«æ°ããURL圢åŒãäœæããå¿
èŠããããŸããããã«ããããããã®åœ¢åŒãæé·ããæéãçµã€ã«ã€ããŠãµããŒããè€éã«ãªããŸãã
ã³ãŒãã®èŠ³ç¹ããèŠããšãç»åçæã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
- ãµãŒããŒããã®ãªã¯ãšã¹ããåãå
¥ããURL圢åŒãããããžã®å¿
èŠãªã¿ã€ãã決å®ãããããžã€ã¡ãŒãžãäœæãããžã§ãã¬ãŒã¿ãŒèªäœãšãžã§ãã¬ãŒã¿ãŒã®ããŒã¿ãœãŒã¹ã§ãããªããžã§ã¯ãã®ãã¢ãäœæããåäžã®ã³ã³ãããŒã©ãŒããããŸãã
- URLããã®ãã©ã¡ãŒã¿ãŒã¯ãœãŒã¹ãªããžã§ã¯ãã«æž¡ãããŸãããœãŒã¹ãªããžã§ã¯ãã¯ããããžãäœæããŠããŒãããããã«å¿
èŠãªãªãœãŒã¹ãç解ããŸãã
- ãœãŒã¹ãªããžã§ã¯ãã¯ãžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ãã«ãèšå®ããããŸããããã«ããããžã§ãã¬ãŒã¿ãŒã¯ãæ¢ã«ããŒããããŠãããªãœãŒã¹ããã®ã€ã¡ãŒãžã®ã¢ã»ã³ããªã®ã¿ãåŠçã§ããŸãã
- ã³ã³ãããŒã©ãŒã¯ããžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ãã®çµæãåãåããç®çã®ããããŒãšå
±ã«è¿ããŸãã
ååãšããŠãããŒã¿ãœãŒã¹ãªããžã§ã¯ãã®æ§é ã¯ãããžã®ã¿ã€ãã«ãã£ãŠå€§ããç°ãªãããžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ããåæ§ã®æ§é ãæã£ãŠãããããç¶æ¿å
ã®æœè±¡ã¯ã©ã¹ããããŸãã 次ã®ããã«ãªããŸãã
abstract class AbstractBadgeGenerator { final public function getImage() { $this->startPinbaTimer('isAvailable'); $is_available = $this->isAvailable(); $this->stopPinbaTimer(); if (!$is_available) { return false; } $this->startPinbaTimer('generate'); $Result = $this->generate(); $this->stopPinbaTimer(); return $Result; } public function isAvailable() { return true; } abstract public function generate();
ããã§æãéèŠãªããšã¯getimageã¡ãœããã§ãããã¯ã³ã³ãããŒã©ãŒãããã²ãã€ãããŸãã ç»åãªããžã§ã¯ããè¿ããªãå Žåãã³ã³ãããŒã©ãŒã¯404ãšã©ãŒãè¿ããŸããã¢ã¯ã»ã·ããªãã£ããã³ç»åã¢ã»ã³ããªã¡ãœããã®åŒã³åºãã¯Pinba-timersã§ã«ããŒãããŠãããç¹å®ã®ã¯ã©ã¹ã®ååãååã«çœ®ãæããŸããããã«ãããåã¿ã€ãã®ãããžã®çæã«å¿
èŠãªæéã«é¢ããããŒã¿ãåŸãããŸãã ããã«ãã¿ã€ããŒã䜿çšããŠç¹å®ã®ãžã§ãã¬ãŒã¿ãŒã¯ã©ã¹ã®ç»åã§ãã¹ãŠã®æäœãçµäºããã³ã³ãããŒã©ãŒã§ãœãŒã¹ãšãžã§ãã¬ãŒã¿ãŒã®åèšåäœæéã«é¢ããæ
å ±ãåéããçµ±èšåéã·ã¹ãã ã䜿çšããŠããŒã¿ããŒã¹ã«æžã蟌ã¿ãŸãïŒHabrã§ã¯ã説æä»ãã®
ãããªãèŠã€ããããšãã§ããŸãïŒ
ç»åã䜿çšããå Žåãéåžžã«éãããæ°ã®æäœã䜿çšããŸãïŒä»»æã®è§åºŠã§ã®å転ãç»åã®ãµã€ãºå€æŽãšããªãã³ã°ãã¬ã€ã€ãŒã®ãªãŒããŒã¬ã€ïŒéæ床ãå«ãïŒãããã¹ãã®è¿œå ã ããããå®è¡ããã«ã¯ã
Leptonicaã©ã€ãã©ãªã䜿çšããŸãã
ãã®ã©ã€ãã©ãªã®ã©ãããŒã¯ãAnton Dovgalã«ãã£ãŠäœæãããŸããïŒå€ãããŒãžã§ã³ã¯
githubã«ãããŸã ïŒã 圌女ã¯ç«¶åä»ç€Ÿãããéãåãããããæ°å¹Žåã«åœŒå¥³ãéžã°ããŸããã ãããå®èšŒããããã«ãGDãImageMagickãããã³Leptonicaãšã®å°ããªãã³ãããŒã¯æ¯èŒãè¡ããŸããã
ã©ã€ãã©ãªããšã«ããµã€ãºã1000x1000ã®æ°ããã€ã¡ãŒãžãäœæããã¹ã¯ãªãããäœæããŸããããã®ã€ã¡ãŒãžã«ã¯ããã£ã¹ã¯ããèªã¿èŸŒãŸããå¥ã®ã€ã¡ãŒãžïŒãªãœãŒã¹ã®ã¢ããã°ïŒãã¹ãŒããŒã€ã³ããŒãºãããŸãã ã³ãŒãããããžã®çææã«äœ¿çšããããã®ã«è¿ã¥ããããã«ãããŒããããã€ã¡ãŒãžã«ããã€ãã®æäœãè¿œå ããŸãã-çž®å°ããŠå転ããŸãã æäœã®çµæã¯ãJPEG圢åŒã§ãã£ã¹ã¯ã«ä¿åãããŸãã ãã®ãããªã·ããªãªã«ããããããžãçæãããšãã«äœ¿çšããã»ãŒãã¹ãŠã®æäœã®é床ãæšå®ã§ããŸãã èšäºã®ã³ãŒãèªäœã¯ãµã€ãºã倧ããããæäŸããŸããããèå³ã®ããæ¹
ã¯GitHubã«ãœãŒã¹ã³ãŒãã
æçš¿ããŸã ã
ãµãŒããŒã§ãããã®ã¹ã¯ãªããã100åé£ç¶ããŠå®è¡ãããšã次ã®çµæãåŸãããŸããã

ãã¹ãçµæã«ãããšããã®ã·ããªãªã§ã¯ãLeptonicaã¯GDããã³Imagemagickã®ã»ãŒ2åã®éãã§ãããåèšæéã¯ã»ãŒåãã§ããã
ãã¡ãããå®éã®ãããžã®çæã§ã¯ããã®ãã¹ããããã¯ããã«å€ãã®ç»åæäœã䜿çšããããããLeptonicaããã§ã«é«éã§åäœããŠããããšãæåŸ
ããªãã§ãã ããããã ããå¿
èŠãªæäœã®æ°ãæå°éã«æããŠãã ããã ãããè¡ãã«ã¯ããªãœãŒã¹ã®æºå段éã§æé©åãå®è¡ããã§ããã ãå€ãã®ã¬ã€ã€ãŒã1ã€ã®ã€ã¡ãŒãžã«çµåããŸãã
çæçµæã®ãã¹ã
åŸã
ã«ããããžãå¢ããŠãããŸãããã³ãŒããŸãã¯ãªãœãŒã¹ãå€æŽããåŸããã¹ãŠã®ãããžãæ£ããæ©èœããããšã確èªãããã£ãã®ã§ãã ãã®ããã«ãæ©èœãã¹ãã䜿çšããããšã«ããŸããããŠãŒã¶ãŒã®ã¹ã¿ãã圌ã®åçãããã³è³ãäœæãããããžã®URLãäœæããŠãžã§ãã¬ãŒã¿ãŒã«æž¡ããŸããã äž»ãªåé¡ã¯ãçµæãæ£ç¢ºã«ç¢ºèªããããšã§ããã æãããªæ¹æ³-ãã¹ãã§çæãããç»åãæ¢åã®ãµã³ãã«ãšæ¯èŒãã-ç§ãã¡ã¯æ¬åœã«å¥œãã§ã¯ãããŸããã§ããããªããªã 圌ã¯ããã¹ãŠã®å¯èœãªãããžãµã³ãã«ïŒçªå·ã50ã«éããïŒãå€æŽããŠæåã§çµã¿ç«ãŠãããšãèŠæ±ããèªååã®é
åã奪ããŸããããŸãã¯ããªãã·ã§ã³ã®äžéšã ããåã£ãå Žåããã¹ãŠã®ãããžãæ©èœããããšãä¿èšŒããŸããã§ããã
ããã€ãã®èããšå®éšã®åŸã2ã€ã®åçŽåãããã¿ã€ãã®ãã§ãã¯ã䜿çšãå§ããŸããã
- çæçµæã®åºæ¬çãªæ€èšŒïŒãžã§ãã¬ãŒã¿ãŒãæåŸ
ããããµã€ãºã®ç»åãæ£ç¢ºã«è¿ããå¶åŸ¡ç¹ã«è€æ°ã®è²ãå«ãŸããŠããããšãæ€èšŒããŸãã
- ããã€ãã®çæçµæã®æ¯èŒïŒãã¹ãã§ã¯ãã»ãŒãã¹ãŠãé¡äŒŒããŠãã2ã€ã®ãããžã®URLãçæããŸããã1ã€ã®ãã©ã¡ãŒã¿ãŒïŒèšèªã³ãŒãã衚瀺ããã¹ããè³ãªã©ïŒã®ã¿ãç°ãªãã2ã€ã®ç»åãååŸããããšãæåŸ
ããŠããŸããäºãã«ç°ãªãã å°ãªããšã1ã€ã®ã³ã³ãããŒã«ãã€ã³ãã§è²ã®äžäžèŽãååšããããšãéããšå®çŸ©ããŸãã
äž¡æ¹ã®ãã§ãã¯ã§ãå¶åŸ¡ç¹ã®æŠå¿µã衚瀺ãããŸãã ããã¯ãäœããã®ã«ãŒã«ã«ãã£ãŠåŸãããç»åå
ã®äžé£ã®ç¹ãæå³ããŸãã å
·äœçã«ã¯ãç»åãæ°Žå¹³ããã³åçŽã«10åã®çããéšåã«åå²ããŸãããã®çµæãç·ã®äº€ç¹ã§81åã®ã³ã³ãããŒã«ãã€ã³ããååŸããåæ§ã®ã³ãŒãã䜿çšããŠã«ã©ãŒããããåéããŸãã
protected function getImageColorsMap($Image, $color_grid_size = self::COLOR_GRID_SIZE) { $image_info = $Image->getInfo(); $dx = ceil($image_info['width'] / $color_grid_size); $dy = ceil($image_info['height'] / $color_grid_size); $colors_map = []; for ($row = 1; $row < $color_grid_size; $row++) { for ($cell = 1; $cell < $color_grid_size; $cell++) { $x = $dx * $cell; $y = $dy * $row; $color = $Image->getOnePixel($x, $y); $colors_map[$color][] = [$x, $y]; } } return $colors_map; }
2ã€ã®ç»åã®ãã¹ãŠã®ç¹ãäžèŽãããšããããšã¯ããããã®ç»åãå®å
šã«äžèŽããããšãæå³ãããã®ã§ã¯ãããŸããããããã¯æ³šæããŠããã®ãããªç¹ã®æ°ãå¢ãããã誀æ€åºãé »ç¹ã«çºçããå Žåã®éžæèŠåãå€æŽããçç±ã§ãã å®éã«ã¯ã81ãã€ã³ãã§ã誀æ€ç¥ã«ééããããšã¯ãããŸããã
ãã¡ããããã®ãããªåçŽãªãã§ãã¯ã¯ããããžãç§ãã¡ãæåŸ
ãããã®ãæ£ç¢ºã«è¡šç€ºããããšãä¿èšŒããŸããã ãããããããã¯ãã¹ãŠã®ãããžãæ©èœããããšããã°ãã確èªããæ¬çªçšŒååã«ããã€ãã®ãã°ããã£ããããã®ã«åœ¹ç«ã¡ãŸããããããã®äžéšã¯ãPHPçæã³ãŒãã§ã¯ãªããç»åãæäœããããã®ãã·ã¹ãã ãã©ã€ãã©ãªã§èš±å¯ãããŠããŸããã
ããã¹ãåºåã®åé¡
ãã®èšäºã§ã¯ç»åçæã«çŠç¹ãåœãŠãŠããŸããã解決ã«æãæéãããã£ãåé¡ã¯ããã¹ãã«é¢é£ããŠããŸããã
ããã¹ãã«ããã¢ã«ãã¡ãããã®å®çŸ©
ããã¹ããç°ãªãèšèªã§è¡šç€ºããŸãã äžéšã®èšèªã§ã¯ãããªã«æåãšã©ãã³æå以å€ã®ã¢ã«ãã¡ãããã䜿çšããŠããŸããããã¹ãŠã®ãã©ã³ãããããããµããŒãããŠããããã§ã¯ãããŸããã ãããã£ãŠãé©åãªãã©ã³ãã䜿çšããã«ã¯ãåºåã«å¿
èŠãªã¢ã«ãã¡ããããç解ããããšãéèŠã§ãã äºåå®çŸ©ãããããŒã¯ã³ãå°åºããå Žåãããã¯éåžžã«ç°¡åã§ã-ããã¹ããæžãããŠããèšèªãç¥ã£ãŠããŸãã ãã ããäžéšã®å Žæã§ã¯ãŠãŒã¶ãŒããã¹ãã衚瀺ãïŒããšãã°ãInstagramã§ãããã£ãŒã«ããå
±æãããå ŽåããŠãŒã¶ãŒåã¯ãããžã«è¡šç€ºãããŸãïŒãã©ã®èšèªã§æžãããŠããã®ãããããŸããã
ãã®åé¡ã¯
ãunicode.orgãŠã§ããµã€ãã§ã°ã«ãŒãã®ã·ã³ãã«ã®ã¡ã³ããŒã·ãããçŽæ¥èŠã€ããããšãã§ãããããéåžžã«ç°¡åã«è§£æ±ºã
ããŸãã ã ç§ãã¡ãããªããã°ãªããªãã£ãã®ã¯ãããŒãã«ãããŠã³ããŒãããŠãæåã®ã°ã«ãŒãã®ç¯å²ãåäžã®ããŒãã«ã«çž®å°ããããšã ãã§ããã ãã®ãããªããŒãã«ã䜿çšãããšãæååå
ã®ãã¹ãŠã®æåã確èªãã䜿çšãããŠããã°ã«ãŒãã®ãªã¹ããååŸããããããã¹ãŠã®æåã°ã«ãŒãããµããŒããããã©ã³ããéžæã§ããŸãã
èŠããŠããã¹ãäž»ãªããšïŒãµã€ãäžã®ã³ãŒãã¯UCS-4ã§æäŸãããŠãããå€ãã®UTF-8ã§ã¯ããªãã¿ã®ãã®ã§ã¯ãããŸããã
æå®ããã寞æ³ã«ããã¹ããåããã
ãããžã¯ç°ãªãèšèªã®ããã¹ãã䜿çšããç°ãªãèšèªã®åããã¬ãŒãºã¯é·ããç°ãªããŸãïŒãããã£ãŠãç°ãªãå Žæãå¿
èŠã§ãïŒã ããã¹ããµã€ãºã«åãããããã«ããã©ã³ããµã€ãºã®èª¿æŽãšããã¹ãã®è¡ãžã®åå²ãšãã2ã€ã®ã¢ã«ãŽãªãºã ã䜿çšããŸãã
ãã©ã³ããµã€ãºã®èª¿æŽã ããã¹ãã«äœ¿çšã§ããç¹å®ã®ãçæ³çãªããã©ã³ããµã€ãºãšæ倧å¹
ããããŸãã ããã¹ãããã®å¹
ã«åãŸããã©ããã確èªãïŒããšãã°ãGDã«ã¯imagettfbboxããã³imageftbboxé¢æ°ããããŸãïŒãåãŸãå Žåã¯ãåã«ããã¹ããå°å·ããŸãã ããã¹ããããå€ãã®ã¹ããŒã¹ãå æããå Žåã¯ããã©ã³ããµã€ãºãå°ããããŠãã§ãã¯ãç¹°ãè¿ããŸãã ãµã€ãºã®éžæãå®è£
ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
$font_size = $initial_font_size; $max_x = 0; while ($font_size > $min_font_size) { $text_size = $Image->getTextBox($font_size, $angle, $font, $text); $max_x = max($text_size[2], $text_size[4]); if ($max_width >= $max_x) { break; } $font_size -= 1; }
ãã®ã¢ã«ãŽãªãºã ã¯åçŽãã§ã¯åªããŠããŸããã衚瀺ãããããã¹ãã®é·ãã®å°ããªåºããã«å¯ŸããŠã®ã¿äœ¿çšã§ããŸãã 倧ããªããã¹ãã§ã¯ããã©ã³ããµã€ãºã倧å¹
ã«çž®å°ããå¿
èŠããããããèªã¿ã«ãããªããŸãã ãã®ãããªå Žåãæ¹è¡ã䜿çšããŸãã
æ¹è¡ã¯éåžžã«ç°¡åã«æ©èœããŸãïŒè¡šç€ºã§ããæåæ°ã決å®ãããã®åŸãæåã«ããã¹ããåèªã«åå²ãã次ã«åèªãè¡ã«åéããŸããåæåã¯æ倧æåæ°ãè¶
ããŸããã ããã§ã¯ãæååã®æåæ°ãããé·ãå¯èœæ§ã®ããé·ãåèªãããïŒãã®åŸããã©ã³ããµã€ãºã®èª¿æŽãåå²çµæã«é©çšããå¿
èŠãããïŒãäžéšã®èšèªã§ã¯æšæºã®åºåãæåïŒããšãã°ã
æ¥æ¬èª ïŒã䜿çšããªãããšã«æ³šæããå¿
èŠããããŸãã
å°æ°ã®æåã ãã1è¡ã«åãŸããªãå Žåãæ¹è¡ã¯ããŸãæ©èœããŸããã ãã®ç¶æ³ã®çµæã¯éåžžã1ã€ãŸãã¯2ã€ã®çãåèªãå«ã1ã€ã®é·ãè¡ãš1ã€ã®çãè¡ã§ãã ãã®ç¶æ³ãä¿®æ£ããããã«ãããã¹ããè¡ã®é·ãã«æ²¿ã£ãŠäºãã«ã§ããã ãè¿ãã«2ã€ã«åå²ããããšããŠããŸãã ãããè¡ãããã«ãåå²ãããšããè¡ã®æ倧é·ã§ã¯ãªããããã¹ãã®å®éã®é·ãã®ååã«çŠç¹ãåãããŸãã é·ãåèªãçæ³çãªåºåããå£ããšããåé¡ã解決ããããã«ãããã¹ãã®å
é ããæ«å°ŸãŸã§ãããã³ããã¹ãã®æ«å°Ÿããå
é ãŸã§ã®2ã€ã®ãªãã·ã§ã³ãäœæããŸãããã®åŸãè¡ã®é·ãã®å·®ãå°ãªãæ¹ãéžæããŸãã
$len = mb_strlen($text); if ($len <= 2 * $this->max_line_size) { $ideal_line_len = ceil($len / 2) - 1; $lexems_list = $this->getTextLexems($text); $direct_order_lines = $this->getDirectOrderLines($lexems_list, $ideal_line_len); $reversed_order_lines = $this->getReversedOrderLines($lexems_list, $ideal_line_len); $delta_direct = $this->getLinesDelta($direct_order_lines); $delta_reversed = $this->getLinesDelta($reversed_order_lines); return ($delta_direct < $delta_reversed) ? $direct_order_lines : $reversed_order_lines; }
æè©ã«ã€ããŠã®æ¥œããäºå®ã ç§ãã¡ã®çµéšã§ã¯ãã®ãªã·ã£èªãšã¹ã¯ããªèªã®ããŒã¯ã³ãæãå€ããèŠæ±ããŸããã ãã€ãèªã®ããã¹ãã¯éåžžââçãã§ãããé·ãåèªãååšãããããè¡ã«åå²ããã®ã¯å°é£ã§ãã
å³ããå·Šãžã®ã¯ãŒãããã»ãã·ã³ã°
å³ããå·Šãžã®ã€ã¥ãïŒRTLèšèªïŒã䜿çšããããã¹ãã¯ããã®ãŸãŸè¡šç€ºããããšã¯ã§ããŸãã-ãããã¯å®å
šã«å€èªã§ããŸããã ããã¯ããã®ãããªèšèªã«ã¯ãã¹ãã¬ãŒãžäžã«äœ¿çšãããè«çæåãšã衚瀺ãããèŠèŠæåã®2ã€ã®é åºã®æåãããããã§ãã
ããããUnicodeåæ¹åã¢ã«ãŽãªãºã ïŒç¥ããŠBIDIïŒã¯ããã泚æãå¥ã®æ³šæã«å€æãã圹å²ãæãããŸãã ããã«ã€ããŠã¯ã
ãã ïŒ
BIDIïŒUnicodeåæ¹åã¢ã«ãŽãªãºã ïŒ ïŒãW3C Webãµã€ãïŒ
ããžã¥ã¢ã«ãšããã¹ãã®è«ççé åº ã
Unicodeåæ¹åã¢ã«ãŽãªãºã ã®åºæ¬ ïŒãunicode.orgïŒ
Unicodeåæ¹åã¢ã«ãŽãªãºã ïŒã§è©³çŽ°ãåŠã¶ããšãã§ããŸãã Unicodeã䜿çšããçŸä»£ã®ã¯ã©ã€ã¢ã³ãã«ã¯ããã®ã¢ã«ãŽãªãºã ã®å®è£
ãå«ãŸããŠãããç»åã«ããã¹ããæžã蟌ããšãã¯ããããèªåã§åŠçããå¿
èŠããããŸãã
ããã€ãã®RTLèšèªããããŸãããå
·äœçã«ã¯ããŠãŒã¶ãŒã䜿çšããã®ã¯ã¢ã©ãã¢èªãšããã©ã€èªã®2ã€ã ãã§ããããžçæãªã¯ãšã¹ãã®ç·æ°ã®1ïŒ
æªæºãæäŸããŸãã
ããã©ã€èªã®åé¡ã¯éåžžã«è¿
éã«è§£æ±ºãããŸãããPHPã«ã¯ãè«çããã¹ããããžã¥ã¢ã«ã«å€æããããã®hebrevé¢æ°ãããããã®é¢æ°ã®ããã¥ã¡ã³ãããŒãžã®æåã®ã³ã¡ã³ãã¯ãUTF-8ã®ããã¹ãã«ããã䜿çšããæ¹æ³ã
瀺ããŠããŸãïŒ
$visual_hebrew_text = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $logical_hebrew_text)));
ã¢ã©ãã¢èªã§ã¯ããã¹ãŠãããè€éã§ããã 幞ããªããšã«ããªã¢ãŒãã®ã¢ã©ãã¢èªç¿»èš³è
ã以åã«ãã®ãããªåé¡ã«ééã
ãAr-PHPã©ã€ãã©ãªã®äœæã«åå ããããšã
ãããŸã ã ã©ã€ãã©ãªã«ã¯å€ãã®æ©èœãå«ãŸããŠããŸãããããæ°å¹Žã¯ããŸãç©æ¥µçã«éçºãããŠããŸããã 圌女ã®ãµã€ãã¯å®æçã«å©çšã§ããŸããããã³ãŒãã¯GitHubã®ãã©ãŒã¯ã«ãããŸãïŒ
1ã2ã3 ã å
ã®ããŒãžã§ã³ã§ã¯ãããã¹ãã¯æ¬¡ã®ããã«å€æãããŸãã
$ArabicGlyphs = new \I18N_Arabic_Glyphs(); $visual_arabic_text = $ArabicGlyphs->utf8Glyphs($logical_arabic_text, $max_characters_count);
ããã¹ãããã®æ¹æ³ã§åŠçãããå Žåãimagettftextã®ãããªéåžžã®é¢æ°ã§è¡šç€ºã§ããŸãã ãããã©ã®ããã«èŠãããã§ãïŒ

- åŠçã«å ããŠãRTLããã¹ããæäœããéã«èŠããŠããå¿
èŠã®ããããã€ãã®ãã¥ã¢ã³ã¹ããããŸãã
- ã°ã©ãã£ãã¯ã©ã€ãã©ãªã®æ©èœã䜿çšããŠããã¹ãã衚瀺ããå Žåãããã¹ãã®å·Šå¢çç·ã®åº§æšã瀺ãããŸãããRTLã§ã¯ååãšããŠãæ£ãããã®ãç¥ãå¿
èŠããããŸãã ãããã£ãŠãçµè«èªäœã®åã«ãããã¹ãã®å¹
ãäºåã«èšç®ããå¿
èŠããããŸãããã®åŸãããã¹ããšããã¹ãã®å³å¢çã®åº§æšãç¥ã£ãŠãããå·Šå¢çã®åº§æšãèšç®ã§ããŸãã
- ããã¹ããè€æ°ã®è¡ã«åå²ããŠè¡šç€ºããå Žåãæåã«é åºãéã«ããå¿
èŠããããŸãã ããã¹ããå·Šããå³ã«åå²ããå·Šã®ããã¹ããæåã®èŠçŽ ã«æ ŒçŽãããŠããæååã®é
åãååŸããŸãã RTLããã¹ãã®å Žåãããã¯æåã§ã¯ãªãæåŸã§ãããããã¹ãã¯äžããäžã«æžãããŠããããšãããããŸãããããã¯ééã£ãŠããŸãã
ãããã«
PHPã§ç»åãæäœããããšã¯æã人æ°ã®ãããããã¯ã§ã¯ãªããã€ã³ã¿ãŒãããäžã§æ°ãã«çºçããåé¡ã®è§£æ±ºçãèŠã€ããããšã¯å°é£ã§ãã ç§ã®èšäºã®ãããã§ããããå°ãç°¡åã«ãªãããšãé¡ã£ãŠããŸãã ç§ã®èšäºã§äœããç解ã§ããªããšæããã質åãããå Žåã¯ãã³ã¡ã³ãæ¬ã§è³ªåããŠãã ãããçããŠã¿ãŸãã
TechBadooã®
æè¡ããã°ã§ã¯ãããã«å€ãã®èšäºãè³æãèŠã€ããããšãã§ããŸãã
Viktor Pryazhnikovãæ©èœéçºè