Походит на проблему кодировки символов, в которой файл сохранен как различная кодировка символов к тому, что веб-сервер говорит, что это.
Используйте эту функцию:
http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm
Он поддерживает несколько битрейтов, например 16 и 32 бит. Кроме того, он содержит некоторые исправления, касающиеся отсутствующего размера файла, отрицательных цветовых палитр, вывода ошибок, дополнительного 16-битного заголовка маски (это была основная проблема для 16-битной) и уменьшенной цветовой палитры (biClrUsed).
Надеюсь, вам понравится;)
Обновление в 2015 году: эта функция теперь является частью DOMPDF (поиск на странице "imagecreatefrombmp") и доведена до совершенства. Теперь он охватывает сжатые 4- и 8-битные файлы, игнорирует неважные заголовки и поддерживает специальную 16-битную маску 565.
В то время как GD не поддерживает BMP изначально, небольшой поиск в Google предоставляет несколько пользовательских реализаций функции imagecreatefrombmp ().
Я не пробовал их, но уверен, что по крайней мере один из них подойдет вам.
Вне моей головы:
function convert_to_jpeg( $input_path, $output_path )
{
$image = imagecreatefromstring(file_get_contents($input_path));
imagejpeg($image, $output_path);
imagedestroy($image);
}
Это будет принимать любой формат, который GD может обрабатывать в качестве ввода и вывода файл jpeg. Я не знаю, какую версию GD вы используете, но моя прекрасно обрабатывает .bmp, как и версия, которую мы использовали в предыдущей компании, в которой я работал. (в Mac OS X 10.6 и CentOS 5 соответственно)
редактировать : забыл imagedestroy! ой!
Как насчет функции imagejpeg ?
bool imagejpeg (resource $ image [, строка $ filename [, int $ quality]] )
imagejpeg () создает файл JPEG из данное изображение.
Чтобы получить помощь по поддержке формата BMP в GD, посмотрите, например, здесь .
РЕДАКТИРОВАТЬ: Это не поддерживает 16-битные изображения, что является правильным как исходное растровое изображение спецификация не поддерживает это. В вашем случае выясните, какой битовый шаблон используется для кодирования значения цвета. Я предполагаю, что это 5 бит для R и B, 6 бит для G и порядок BGR в этом решении (пожалуйста, вставьте в код, на который я ссылался выше):
else if ($bits == 16) {
$gd_scan_line = "";
$j = 0;
while($j < $scan_line_size) {
$byte1 = $scan_line{$j++};
$byte2 = $scan_line{$j++};
$b = chr($byte1 >> 3) * (255 / 31);
$g = (chr($byte1 & 0x07) + chr($byte2 >> 5)) * (255 / 63);
$r = chr($byte2 & 0x1F) * (255 / 31);
$gd_scan_line .= "\x00$r$g$b";
}
Обратите внимание, что я не тестировал этот код (в частности, я Я не уверен насчет масштабирования до 0..255), и он будет работать только при использовании 5-6-5-битного шаблона (ну, он будет работать и с другими, но цвета будут неправильными).