BMP to JPG

dj100gr

Новичок
BMP to JPG

есть картинка image.bmp - в браузере нужно вывести картинку такогоже размера и без потери качества - image.jpg - это вообще возможно без использования внешних приложений, с GD мучился очень много так ничего и не получилось...
 

Acabar

Новичок
Тогда иди поиграй в футбол.

-~{}~ 25.04.06 11:41:

мне интересно, у тебя вообще библиотека GD запущенна или нет? Ты поясни хотя бы что именно у тебя не получаеться.
 

clops

Новичок
а ещё для настоящих пацанофф есть в юниксе обычно imagemagik
 

dj100gr

Новичок
Acabar - я бы тебе сказал куда тебе надо идти....

в документации нет ничего о конвертации... нужен совет... ну с какой стороны хоть подходить к этой проблеме.

-~{}~ 25.04.06 12:44:

clops - серваке на котором проблема - виндовый :(
 

Acabar

Новичок
Ты вообще ничего не пояснил нормально в своей проблеме, не задал вопроса и не сказал какие у тебя проблемы возникают. Ты что? Ждёшь что тебе тут дадут готовый код. Тебе могут дать направление или что то подправить в твоём коде. У меня лично возникло впечатление что у тебя вообще не подключен модуль GD.
 

dj100gr

Новичок
модуль подключен. получается открыть взять jpg изменить размеры наложить текст, получается сделать тоже самое с bmp, а вот взять bmp а браузере отобразить jpg... - вот тут облом (просто черный рисунок получается).

Acabar - ты всегда сначала грубишь?
 

dj100gr

Новичок
так тоже не работает, похоже что функция imagejpeg не может вставить в браузер то что возвращает imagecreatefromwbmp()
 

Crys

Двинутый новичок
так тоже не работает, похоже что функция imagejpeg не может вставить в браузер то что возвращает imagecreatefromwbmp
Приведи пример кода, который ты выполняешь. Пример, который привел sayber - не должен работать так, как ты хочешь. Твоя задача - взять оттуда идею (гыы...)
 

Acabar

Новичок
Я сам не знал как конвертировать в jpg. Но вот послушался его совету и у меня всё получилось. Самое главное что он сдесь написал "Примеры посмотри в коментариях" Я и посмотрел. Правда в коментариях к функции imagecreate. И представляешь, нашёл ответ. Правда извиняюсь что вначале нагрубил, просто я поражаюсь с людей, которые чуть что, сразу постят в форум, прежде чем порыскаться в нём, в статьях и самое главное на сайте php.net .
Вот решение твоей проблемы, у меня всё работает норм. Это кстате в коментариях нашёл.
PHP:
<?php
/*********************************************/
/* Fonction: ImageCreateFromBMP              */
/* Author:  DHKold                          */
/* Contact:  [email][email protected][/email]                */
/* Date:    The 15th of June 2005          */
/* Version:  2.0B                            */
/*********************************************/

function ImageCreateFromBMP($filename)
{
 //Ouverture du fichier en mode binaire
   if (! $f1 = fopen($filename,"rb")) return FALSE;

 //1 : Chargement des ent&#65533;tes FICHIER
   $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
   if ($FILE['file_type'] != 19778) return FALSE;

 //2 : Chargement des ent&#65533;tes BMP
   $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
                 '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
                 '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
   $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
   if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
   $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
   $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
   $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] = 4-(4*$BMP['decal']);
   if ($BMP['decal'] == 4) $BMP['decal'] = 0;

 //3 : Chargement des couleurs de la palette
   $PALETTE = array();
   if ($BMP['colors'] < 16777216)
   {
   $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
   }

 //4 : Cr&#65533;ation de l'image
   $IMG = fread($f1,$BMP['size_bitmap']);
   $VIDE = chr(0);

   $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
   $P = 0;
   $Y = $BMP['height']-1;
   while ($Y >= 0)
   {
   $X=0;
   while ($X < $BMP['width'])
   {
     if ($BMP['bits_per_pixel'] == 24)
       $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
     elseif ($BMP['bits_per_pixel'] == 16)
     {  
       $COLOR = unpack("n",substr($IMG,$P,2));
       $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 8)
     {  
       $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
       $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 4)
     {
       $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
       if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
       $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 1)
     {
       $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
       if    (($P*8)%8 == 0) $COLOR[1] =  $COLOR[1]        >>7;
       elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
       elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
       elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
       elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
       elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
       elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
       elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
       $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     else
       return FALSE;
     imagesetpixel($res,$X,$Y,$COLOR[1]);
     $X++;
     $P += $BMP['bytes_per_pixel'];
   }
   $Y--;
   $P+=$BMP['decal'];
   }

 //Fermeture du fichier
   fclose($f1);

 return $res;
}

$m = ImageCreateFromBMP("New.bmp");
imagejpeg($m, "new.jpg", 70);
?>
С помощью поиска всё нашёл и сделал за 5-10 минут.
 

dj100gr

Новичок
использовал я вот такой скрипт
$image = "image.jpg";

$size = GetImageSize($image);
$width = $size[0];
$height = $size[1];

$tn_width=146;
$tn_height=202;

$src = ImageCreateFromJpeg($image);
$dst = imagecreatetruecolor($tn_width,$tn_height);
ImageCopyResized($dst, $src, 0, 0, 0, 0, $tn_width,$tn_height,$width,$height);
header("Content-type: image/jpeg");
ImageJpeg($dst, null, -1);
ImageDestroy($src);
ImageDestroy($dst);

все было нормально пока не появились bmp - а bmp некоректно выводятся на печать, пользователей 70 человек - у половины стоит win98 и нельзя настроить принтер.

в общем сделать нужно тоже самое - только на входе bmp

-~{}~ 25.04.06 13:57:

за скрипт спасибо буду пробовать...
 

dj100gr

Новичок
а если в этом скрипте bits_per_pixel=32 - вот тогда я вообще не знаю что можно сделать....
 

SiMM

Новичок
> а если в этом скрипте bits_per_pixel=32 - вот тогда я вообще не знаю что можно сделать....
Предположу, что аналогично.
PHP:
if ($BMP['bits_per_pixel'] == 32) 
       $COLOR = unpack("V",substr($IMG,$P,4));
 
Сверху