1: <?php
2: /**
3: * PHPExcel
4: *
5: * Copyright (c) 2006 - 2014 PHPExcel
6: *
7: * This library is free software; you can redistribute it and/or
8: * modify it under the terms of the GNU Lesser General Public
9: * License as published by the Free Software Foundation; either
10: * version 2.1 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public
18: * License along with this library; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20: *
21: * @category PHPExcel
22: * @package PHPExcel_Shared
23: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24: * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25: * @version 1.8.0, 2014-03-02
26: */
27:
28:
29: /**
30: * PHPExcel_Shared_Drawing
31: *
32: * @category PHPExcel
33: * @package PHPExcel_Shared
34: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35: */
36: class PHPExcel_Shared_Drawing
37: {
38: /**
39: * Convert pixels to EMU
40: *
41: * @param int $pValue Value in pixels
42: * @return int Value in EMU
43: */
44: public static function pixelsToEMU($pValue = 0) {
45: return round($pValue * 9525);
46: }
47:
48: /**
49: * Convert EMU to pixels
50: *
51: * @param int $pValue Value in EMU
52: * @return int Value in pixels
53: */
54: public static function EMUToPixels($pValue = 0) {
55: if ($pValue != 0) {
56: return round($pValue / 9525);
57: } else {
58: return 0;
59: }
60: }
61:
62: /**
63: * Convert pixels to column width. Exact algorithm not known.
64: * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875
65: * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.
66: *
67: * @param int $pValue Value in pixels
68: * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook
69: * @return int Value in cell dimension
70: */
71: public static function pixelsToCellDimension($pValue = 0, PHPExcel_Style_Font $pDefaultFont) {
72: // Font name and size
73: $name = $pDefaultFont->getName();
74: $size = $pDefaultFont->getSize();
75:
76: if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {
77: // Exact width can be determined
78: $colWidth = $pValue
79: * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width']
80: / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'];
81: } else {
82: // We don't have data for this particular font and size, use approximation by
83: // extrapolating from Calibri 11
84: $colWidth = $pValue * 11
85: * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width']
86: / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / $size;
87: }
88:
89: return $colWidth;
90: }
91:
92: /**
93: * Convert column width from (intrinsic) Excel units to pixels
94: *
95: * @param float $pValue Value in cell dimension
96: * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook
97: * @return int Value in pixels
98: */
99: public static function cellDimensionToPixels($pValue = 0, PHPExcel_Style_Font $pDefaultFont) {
100: // Font name and size
101: $name = $pDefaultFont->getName();
102: $size = $pDefaultFont->getSize();
103:
104: if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {
105: // Exact width can be determined
106: $colWidth = $pValue
107: * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px']
108: / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'];
109:
110: } else {
111: // We don't have data for this particular font and size, use approximation by
112: // extrapolating from Calibri 11
113: $colWidth = $pValue * $size
114: * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px']
115: / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / 11;
116: }
117:
118: // Round pixels to closest integer
119: $colWidth = (int) round($colWidth);
120:
121: return $colWidth;
122: }
123:
124: /**
125: * Convert pixels to points
126: *
127: * @param int $pValue Value in pixels
128: * @return int Value in points
129: */
130: public static function pixelsToPoints($pValue = 0) {
131: return $pValue * 0.67777777;
132: }
133:
134: /**
135: * Convert points to pixels
136: *
137: * @param int $pValue Value in points
138: * @return int Value in pixels
139: */
140: public static function pointsToPixels($pValue = 0) {
141: if ($pValue != 0) {
142: return (int) ceil($pValue * 1.333333333);
143: } else {
144: return 0;
145: }
146: }
147:
148: /**
149: * Convert degrees to angle
150: *
151: * @param int $pValue Degrees
152: * @return int Angle
153: */
154: public static function degreesToAngle($pValue = 0) {
155: return (int)round($pValue * 60000);
156: }
157:
158: /**
159: * Convert angle to degrees
160: *
161: * @param int $pValue Angle
162: * @return int Degrees
163: */
164: public static function angleToDegrees($pValue = 0) {
165: if ($pValue != 0) {
166: return round($pValue / 60000);
167: } else {
168: return 0;
169: }
170: }
171:
172: /**
173: * Create a new image from file. By alexander at alexauto dot nl
174: *
175: * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214
176: * @param string $filename Path to Windows DIB (BMP) image
177: * @return resource
178: */
179: public static function imagecreatefrombmp($p_sFile)
180: {
181: // Load the image into a string
182: $file = fopen($p_sFile,"rb");
183: $read = fread($file,10);
184: while(!feof($file)&&($read<>""))
185: $read .= fread($file,1024);
186:
187: $temp = unpack("H*",$read);
188: $hex = $temp[1];
189: $header = substr($hex,0,108);
190:
191: // Process the header
192: // Structure: http://www.fastgraph.com/help/bmp_header_format.html
193: if (substr($header,0,4)=="424d")
194: {
195: // Cut it in parts of 2 bytes
196: $header_parts = str_split($header,2);
197:
198: // Get the width 4 bytes
199: $width = hexdec($header_parts[19].$header_parts[18]);
200:
201: // Get the height 4 bytes
202: $height = hexdec($header_parts[23].$header_parts[22]);
203:
204: // Unset the header params
205: unset($header_parts);
206: }
207:
208: // Define starting X and Y
209: $x = 0;
210: $y = 1;
211:
212: // Create newimage
213: $image = imagecreatetruecolor($width,$height);
214:
215: // Grab the body from the image
216: $body = substr($hex,108);
217:
218: // Calculate if padding at the end-line is needed
219: // Divided by two to keep overview.
220: // 1 byte = 2 HEX-chars
221: $body_size = (strlen($body)/2);
222: $header_size = ($width*$height);
223:
224: // Use end-line padding? Only when needed
225: $usePadding = ($body_size>($header_size*3)+4);
226:
227: // Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
228: // Calculate the next DWORD-position in the body
229: for ($i=0;$i<$body_size;$i+=3)
230: {
231: // Calculate line-ending and padding
232: if ($x>=$width)
233: {
234: // If padding needed, ignore image-padding
235: // Shift i to the ending of the current 32-bit-block
236: if ($usePadding)
237: $i += $width%4;
238:
239: // Reset horizontal position
240: $x = 0;
241:
242: // Raise the height-position (bottom-up)
243: $y++;
244:
245: // Reached the image-height? Break the for-loop
246: if ($y>$height)
247: break;
248: }
249:
250: // Calculation of the RGB-pixel (defined as BGR in image-data)
251: // Define $i_pos as absolute position in the body
252: $i_pos = $i*2;
253: $r = hexdec($body[$i_pos+4].$body[$i_pos+5]);
254: $g = hexdec($body[$i_pos+2].$body[$i_pos+3]);
255: $b = hexdec($body[$i_pos].$body[$i_pos+1]);
256:
257: // Calculate and draw the pixel
258: $color = imagecolorallocate($image,$r,$g,$b);
259: imagesetpixel($image,$x,$height-$y,$color);
260:
261: // Raise the horizontal position
262: $x++;
263: }
264:
265: // Unset the body / free the memory
266: unset($body);
267:
268: // Return image-object
269: return $image;
270: }
271:
272: }
273: