Bmp uzantılı resim dosyasını jpg veya png olarak kaydetmek

Uzun zaman önce bu sorunla bende karşılaşmıştım ve yabancı kaynak olsun, türkçe kaynak olsun adam akıllı bilgi bulamamıştım.
Şimdi diyceksiniz kardeşim git uzantısını “jpg” olarak değiştir olsun bitsin.
Malesef bu şekilde davranmak, resim üzerinde oynamak istediğimizde hatalarla karşılaşmamız anlamına gelmektedir. Örnek olarak Bmp uzantılı resimler sıkıştırlmadan oluşturulduğu için jpg olarak kaydedilerek dosyanın daha az yer kaplamasını sağlayabiliriz. Bunun için bmp uzantılı resmin image nesnesini elde etmemiz gerekmekte. Php’de bmp için “imagecreatefromgif” gibi hazır fonksiyon bulunmamakta. Bunun için kendi fonksiyonumuzu yazmamız gerekmekte.
Zamanında bulduğum hazır fonksiyonu sizlerle paylaşmak istiyorum. Şu ana kadar herhangi bir sorunla karşılaşmadım. Image nesnesini başarılı şekilde bize vermektedir.
private function imagecreatefrombmp($filename)
{
// version 1.00
if (!($fh = fopen($filename, 'rb'))) {
trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);
return false;
}
// read file header
$meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14));
// check for bitmap
if ($meta['type'] != 19778) {
trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING);
return false;
}
// read image header
$meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40));
// read additional 16bit header
if ($meta['bits'] == 16) {
$meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12));
}
// set bytes and padding
$meta['bytes'] = $meta['bits'] / 8;
$meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4)));
if ($meta['decal'] == 4) {
$meta['decal'] = 0;
}
// obtain imagesize
if ($meta['imagesize'] < 1) {
$meta['imagesize'] = $meta['filesize'] - $meta['offset'];
// in rare cases filesize is equal to offset so we need to read physical size
if ($meta['imagesize'] < 1) {
$meta['imagesize'] = @filesize($filename) - $meta['offset'];
if ($meta['imagesize'] < 1) {
trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING);
return false;
}
}
}
// calculate colors
$meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors'];
// read color palette
$palette = array();
if ($meta['bits'] < 16) {
$palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4));
// in rare cases the color value is signed
if ($palette[1] < 0) { foreach ($palette as $i => $color) {
$palette[$i] = $color + 16777216;
}
}
}
// create gd image
$im = imagecreatetruecolor($meta['width'], $meta['height']);
$data = fread($fh, $meta['imagesize']);
$p = 0;
$vide = chr(0);
$y = $meta['height'] - 1;
$error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!';
// loop through the image data beginning with the lower left corner
while ($y >= 0) {
$x = 0;
while ($x < $meta['width']) { switch ($meta['bits']) { case 32: case 24: if (!($part = substr($data, $p, 3))) { trigger_error($error, E_USER_WARNING); return $im; } $color = unpack('V', $part . $vide); break; case 16: if (!($part = substr($data, $p, 2))) { trigger_error($error, E_USER_WARNING); return $im; } $color = unpack('v', $part); $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); break; case 8: $color = unpack('n', $vide . substr($data, $p, 1)); $color[1] = $palette[ $color[1] + 1 ]; break; case 4: $color = unpack('n', $vide . substr($data, floor($p), 1)); $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F;
$color[1] = $palette[ $color[1] + 1 ];
break;
case 1:
$color = unpack('n', $vide . substr($data, floor($p), 1));
switch (($p * 8) % 8) {
case 0:
$color[1] = $color[1] >> 7;
break;
case 1:
$color[1] = ($color[1] & 0x40) >> 6;
break;
case 2:
$color[1] = ($color[1] & 0x20) >> 5;
break;
case 3:
$color[1] = ($color[1] & 0x10) >> 4;
break;
case 4:
$color[1] = ($color[1] & 0x8) >> 3;
break;
case 5:
$color[1] = ($color[1] & 0x4) >> 2;
break;
case 6:
$color[1] = ($color[1] & 0x2) >> 1;
break;
case 7:
$color[1] = ($color[1] & 0x1);
break;
}
$color[1] = $palette[ $color[1] + 1 ];
break;
default:
trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING);
return false;
}
imagesetpixel($im, $x, $y, $color[1]);
$x++;
$p += $meta['bytes'];
}
$y--;
$p += $meta['decal'];
}
fclose($fh);
return $im;
}
imagecreatefrombmp foksiyonunu çağırıp parametre olara da resmin yolunu gönderdiğimizde bize image nesnesini verecektir. Benden fonksiyonun açıklamasını istemeyin çünkü mükemmel çalıştığı için incelemek gibi bir düşüncem olmadı.
private function bmp2Jpeg($originalFile, $outputFile)
{
$image = $this->imagecreatefrombmp($originalFile);
imagejpeg($image, $outputFile, 100);
imagedestroy($image);
@unlink($originalFile);
}
Yukarıdaki fonksiyon ile bmp uzantılı bir resmi nasıl jpg uzantılı bir resime dönüştüreceğimizi görebilirsiniz.
Sıkıntısız kodlar yazmanız dileğiyle…
1 Yorum bulunmaktadır - “Bmp uzantılı resim dosyasını jpg veya png olarak kaydetmek”
Yorum Yapın
Etiketler
Son Yazılar
- Hosting koşuşturması
- Internet Explorer 7 deki “Expected identifier, string or number ” hatası
- Jquery de bir objenin null kontrolünün yapılması
- Jquery ile div taglarinin yüksekliklerini ayarlamak
- Javascriptte bir fonksiyonun var ise çağrılması
Son Yorumlar
- Php’ de RSS oluşturmak için Ömer Kadir Oruç
- Php’ de RSS oluşturmak için Murat Şenkul
- Silverlight 4.0 ile web kamerasına bağlanmak için Enes Pekkaya
- Silverlight 4.0 ile web kamerasına bağlanmak için ali akar
- Asp.Net’ de istatistikleri grafikle göstermek için ömer
Haftanın Özlü Sözü
Bağlantılar
- EvMagaza.com
- Hayata Tat Kat
- Innova Bilişim Çözümleri
- Onur Değerli
- Pleksus Bilişim Teknolojileri
- Sinan Gül
- Taner Günal
- Toppik – Minoxil
Arşivler
- Şubat 2013
- Kasım 2012
- Ekim 2012
- Eylül 2012
- Mart 2012
- Şubat 2012
- Ocak 2012
- Aralık 2011
- Kasım 2011
- Ekim 2011
- Eylül 2011
- Temmuz 2011
- Haziran 2011
- Mayıs 2011
- Mart 2011
- Ocak 2011
- Aralık 2010
- Kasım 2010
- Ekim 2010
- Eylül 2010
- Ağustos 2010
- Temmuz 2010
- Haziran 2010
- Mayıs 2010
- Nisan 2010
- Mart 2010
- Şubat 2010
- Ocak 2010
- Haziran 2009
- Mayıs 2009
- Nisan 2009
- Mart 2009


Bak bu güzel oldu