|
|
@@ -20,148 +20,8 @@ |
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
* |
|
|
|
*/ |
|
|
|
if ( ! function_exists( 'imagebmp') ) { |
|
|
|
/** |
|
|
|
* Output a BMP image to either the browser or a file |
|
|
|
* @link http://www.ugia.cn/wp-data/imagebmp.php |
|
|
|
* @author legend <legendsky@hotmail.com> |
|
|
|
* @link http://www.programmierer-forum.de/imagebmp-gute-funktion-gefunden-t143716.htm |
|
|
|
* @author mgutt <marc@gutt.it> |
|
|
|
* @version 1.00 |
|
|
|
* @param resource $image |
|
|
|
* @param string $filename [optional] <p>The path to save the file to.</p> |
|
|
|
* @param int $bit [optional] <p>Bit depth, (default is 24).</p> |
|
|
|
* @param int $compression [optional] |
|
|
|
* @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure. |
|
|
|
*/ |
|
|
|
function imagebmp($im, $filename='', $bit=24, $compression=0) { |
|
|
|
if (!in_array($bit, array(1, 4, 8, 16, 24, 32))) { |
|
|
|
$bit = 24; |
|
|
|
} |
|
|
|
else if ($bit == 32) { |
|
|
|
$bit = 24; |
|
|
|
} |
|
|
|
$bits = pow(2, $bit); |
|
|
|
imagetruecolortopalette($im, true, $bits); |
|
|
|
$width = imagesx($im); |
|
|
|
$height = imagesy($im); |
|
|
|
$colors_num = imagecolorstotal($im); |
|
|
|
$rgb_quad = ''; |
|
|
|
if ($bit <= 8) { |
|
|
|
for ($i = 0; $i < $colors_num; $i++) { |
|
|
|
$colors = imagecolorsforindex($im, $i); |
|
|
|
$rgb_quad .= chr($colors['blue']) . chr($colors['green']) . chr($colors['red']) . "\0"; |
|
|
|
} |
|
|
|
$bmp_data = ''; |
|
|
|
if ($compression == 0 || $bit < 8) { |
|
|
|
$compression = 0; |
|
|
|
$extra = ''; |
|
|
|
$padding = 4 - ceil($width / (8 / $bit)) % 4; |
|
|
|
if ($padding % 4 != 0) { |
|
|
|
$extra = str_repeat("\0", $padding); |
|
|
|
} |
|
|
|
for ($j = $height - 1; $j >= 0; $j --) { |
|
|
|
$i = 0; |
|
|
|
while ($i < $width) { |
|
|
|
$bin = 0; |
|
|
|
$limit = $width - $i < 8 / $bit ? (8 / $bit - $width + $i) * $bit : 0; |
|
|
|
for ($k = 8 - $bit; $k >= $limit; $k -= $bit) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
$bin |= $index << $k; |
|
|
|
$i++; |
|
|
|
} |
|
|
|
$bmp_data .= chr($bin); |
|
|
|
} |
|
|
|
$bmp_data .= $extra; |
|
|
|
} |
|
|
|
} |
|
|
|
// RLE8 |
|
|
|
else if ($compression == 1 && $bit == 8) { |
|
|
|
for ($j = $height - 1; $j >= 0; $j--) { |
|
|
|
$last_index = "\0"; |
|
|
|
$same_num = 0; |
|
|
|
for ($i = 0; $i <= $width; $i++) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
if ($index !== $last_index || $same_num > 255) { |
|
|
|
if ($same_num != 0) { |
|
|
|
$bmp_data .= chr($same_num) . chr($last_index); |
|
|
|
} |
|
|
|
$last_index = $index; |
|
|
|
$same_num = 1; |
|
|
|
} |
|
|
|
else { |
|
|
|
$same_num++; |
|
|
|
} |
|
|
|
} |
|
|
|
$bmp_data .= "\0\0"; |
|
|
|
} |
|
|
|
$bmp_data .= "\0\1"; |
|
|
|
} |
|
|
|
$size_quad = strlen($rgb_quad); |
|
|
|
$size_data = strlen($bmp_data); |
|
|
|
} |
|
|
|
else { |
|
|
|
$extra = ''; |
|
|
|
$padding = 4 - ($width * ($bit / 8)) % 4; |
|
|
|
if ($padding % 4 != 0) { |
|
|
|
$extra = str_repeat("\0", $padding); |
|
|
|
} |
|
|
|
$bmp_data = ''; |
|
|
|
for ($j = $height - 1; $j >= 0; $j--) { |
|
|
|
for ($i = 0; $i < $width; $i++) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
$colors = imagecolorsforindex($im, $index); |
|
|
|
if ($bit == 16) { |
|
|
|
$bin = 0 << $bit; |
|
|
|
$bin |= ($colors['red'] >> 3) << 10; |
|
|
|
$bin |= ($colors['green'] >> 3) << 5; |
|
|
|
$bin |= $colors['blue'] >> 3; |
|
|
|
$bmp_data .= pack("v", $bin); |
|
|
|
} |
|
|
|
else { |
|
|
|
$bmp_data .= pack("c*", $colors['blue'], $colors['green'], $colors['red']); |
|
|
|
} |
|
|
|
} |
|
|
|
$bmp_data .= $extra; |
|
|
|
} |
|
|
|
$size_quad = 0; |
|
|
|
$size_data = strlen($bmp_data); |
|
|
|
$colors_num = 0; |
|
|
|
} |
|
|
|
$file_header = 'BM' . pack('V3', 54 + $size_quad + $size_data, 0, 54 + $size_quad); |
|
|
|
$info_header = pack('V3v2V*', 0x28, $width, $height, 1, $bit, $compression, $size_data, 0, 0, $colors_num, 0); |
|
|
|
if ($filename != '') { |
|
|
|
$fp = fopen($filename, 'wb'); |
|
|
|
fwrite($fp, $file_header . $info_header . $rgb_quad . $bmp_data); |
|
|
|
fclose($fp); |
|
|
|
return true; |
|
|
|
} |
|
|
|
echo $file_header . $info_header. $rgb_quad . $bmp_data; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//From user comments at http://dk2.php.net/manual/en/function.exif-imagetype.php |
|
|
|
if ( ! function_exists( 'exif_imagetype' ) ) { |
|
|
|
function exif_imagetype ( $filename ) { |
|
|
|
if ( ( $info = getimagesize( $filename ) ) !== false ) { |
|
|
|
return $info[2]; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function ellipsis($str, $maxlen) { |
|
|
|
if (strlen($str) > $maxlen) { |
|
|
|
$characters = floor($maxlen / 2); |
|
|
|
return substr($str, 0, $characters) . '...' . substr($str, -1 * $characters); |
|
|
|
} |
|
|
|
return $str; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Class for basic image manipulation |
|
|
|
* |
|
|
|
*/ |
|
|
|
class OC_Image { |
|
|
|
protected $resource = false; // tmp resource. |
|
|
@@ -525,7 +385,7 @@ class OC_Image { |
|
|
|
public function loadFromFile($imagepath=false) { |
|
|
|
if(!is_file($imagepath) || !file_exists($imagepath) || !is_readable($imagepath)) { |
|
|
|
// Debug output disabled because this method is tried before loadFromBase64? |
|
|
|
OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: '.ellipsis($imagepath, 50), OC_Log::DEBUG); |
|
|
|
OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: '.$imagepath, OC_Log::DEBUG); |
|
|
|
return false; |
|
|
|
} |
|
|
|
$itype = exif_imagetype($imagepath); |
|
|
@@ -951,3 +811,138 @@ class OC_Image { |
|
|
|
$this->destroy(); |
|
|
|
} |
|
|
|
} |
|
|
|
if ( ! function_exists( 'imagebmp') ) { |
|
|
|
/** |
|
|
|
* Output a BMP image to either the browser or a file |
|
|
|
* @link http://www.ugia.cn/wp-data/imagebmp.php |
|
|
|
* @author legend <legendsky@hotmail.com> |
|
|
|
* @link http://www.programmierer-forum.de/imagebmp-gute-funktion-gefunden-t143716.htm |
|
|
|
* @author mgutt <marc@gutt.it> |
|
|
|
* @version 1.00 |
|
|
|
* @param resource $image |
|
|
|
* @param string $filename [optional] <p>The path to save the file to.</p> |
|
|
|
* @param int $bit [optional] <p>Bit depth, (default is 24).</p> |
|
|
|
* @param int $compression [optional] |
|
|
|
* @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure. |
|
|
|
*/ |
|
|
|
function imagebmp($im, $filename='', $bit=24, $compression=0) { |
|
|
|
if (!in_array($bit, array(1, 4, 8, 16, 24, 32))) { |
|
|
|
$bit = 24; |
|
|
|
} |
|
|
|
else if ($bit == 32) { |
|
|
|
$bit = 24; |
|
|
|
} |
|
|
|
$bits = pow(2, $bit); |
|
|
|
imagetruecolortopalette($im, true, $bits); |
|
|
|
$width = imagesx($im); |
|
|
|
$height = imagesy($im); |
|
|
|
$colors_num = imagecolorstotal($im); |
|
|
|
$rgb_quad = ''; |
|
|
|
if ($bit <= 8) { |
|
|
|
for ($i = 0; $i < $colors_num; $i++) { |
|
|
|
$colors = imagecolorsforindex($im, $i); |
|
|
|
$rgb_quad .= chr($colors['blue']) . chr($colors['green']) . chr($colors['red']) . "\0"; |
|
|
|
} |
|
|
|
$bmp_data = ''; |
|
|
|
if ($compression == 0 || $bit < 8) { |
|
|
|
$compression = 0; |
|
|
|
$extra = ''; |
|
|
|
$padding = 4 - ceil($width / (8 / $bit)) % 4; |
|
|
|
if ($padding % 4 != 0) { |
|
|
|
$extra = str_repeat("\0", $padding); |
|
|
|
} |
|
|
|
for ($j = $height - 1; $j >= 0; $j --) { |
|
|
|
$i = 0; |
|
|
|
while ($i < $width) { |
|
|
|
$bin = 0; |
|
|
|
$limit = $width - $i < 8 / $bit ? (8 / $bit - $width + $i) * $bit : 0; |
|
|
|
for ($k = 8 - $bit; $k >= $limit; $k -= $bit) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
$bin |= $index << $k; |
|
|
|
$i++; |
|
|
|
} |
|
|
|
$bmp_data .= chr($bin); |
|
|
|
} |
|
|
|
$bmp_data .= $extra; |
|
|
|
} |
|
|
|
} |
|
|
|
// RLE8 |
|
|
|
else if ($compression == 1 && $bit == 8) { |
|
|
|
for ($j = $height - 1; $j >= 0; $j--) { |
|
|
|
$last_index = "\0"; |
|
|
|
$same_num = 0; |
|
|
|
for ($i = 0; $i <= $width; $i++) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
if ($index !== $last_index || $same_num > 255) { |
|
|
|
if ($same_num != 0) { |
|
|
|
$bmp_data .= chr($same_num) . chr($last_index); |
|
|
|
} |
|
|
|
$last_index = $index; |
|
|
|
$same_num = 1; |
|
|
|
} |
|
|
|
else { |
|
|
|
$same_num++; |
|
|
|
} |
|
|
|
} |
|
|
|
$bmp_data .= "\0\0"; |
|
|
|
} |
|
|
|
$bmp_data .= "\0\1"; |
|
|
|
} |
|
|
|
$size_quad = strlen($rgb_quad); |
|
|
|
$size_data = strlen($bmp_data); |
|
|
|
} |
|
|
|
else { |
|
|
|
$extra = ''; |
|
|
|
$padding = 4 - ($width * ($bit / 8)) % 4; |
|
|
|
if ($padding % 4 != 0) { |
|
|
|
$extra = str_repeat("\0", $padding); |
|
|
|
} |
|
|
|
$bmp_data = ''; |
|
|
|
for ($j = $height - 1; $j >= 0; $j--) { |
|
|
|
for ($i = 0; $i < $width; $i++) { |
|
|
|
$index = imagecolorat($im, $i, $j); |
|
|
|
$colors = imagecolorsforindex($im, $index); |
|
|
|
if ($bit == 16) { |
|
|
|
$bin = 0 << $bit; |
|
|
|
$bin |= ($colors['red'] >> 3) << 10; |
|
|
|
$bin |= ($colors['green'] >> 3) << 5; |
|
|
|
$bin |= $colors['blue'] >> 3; |
|
|
|
$bmp_data .= pack("v", $bin); |
|
|
|
} |
|
|
|
else { |
|
|
|
$bmp_data .= pack("c*", $colors['blue'], $colors['green'], $colors['red']); |
|
|
|
} |
|
|
|
} |
|
|
|
$bmp_data .= $extra; |
|
|
|
} |
|
|
|
$size_quad = 0; |
|
|
|
$size_data = strlen($bmp_data); |
|
|
|
$colors_num = 0; |
|
|
|
} |
|
|
|
$file_header = 'BM' . pack('V3', 54 + $size_quad + $size_data, 0, 54 + $size_quad); |
|
|
|
$info_header = pack('V3v2V*', 0x28, $width, $height, 1, $bit, $compression, $size_data, 0, 0, $colors_num, 0); |
|
|
|
if ($filename != '') { |
|
|
|
$fp = fopen($filename, 'wb'); |
|
|
|
fwrite($fp, $file_header . $info_header . $rgb_quad . $bmp_data); |
|
|
|
fclose($fp); |
|
|
|
return true; |
|
|
|
} |
|
|
|
echo $file_header . $info_header. $rgb_quad . $bmp_data; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ( ! function_exists( 'exif_imagetype' ) ) { |
|
|
|
/** |
|
|
|
* Workaround if exif_imagetype does not exist |
|
|
|
* @link http://www.php.net/manual/en/function.exif-imagetype.php#80383 |
|
|
|
* @param string $filename |
|
|
|
* @return string|boolean |
|
|
|
*/ |
|
|
|
function exif_imagetype ( $filename ) { |
|
|
|
if ( ( $info = getimagesize( $filename ) ) !== false ) { |
|
|
|
return $info[2]; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |