Php ile Ico dosyası oluşturmak

Genel Yorum Yok »

Bugün yaptığımız sitelere otomatik olarak favicon dosyası nasıl oluşturum diye araştırma yaptım.
Çoğu popüler tarayıcı PNG destelemesine rağmen IE desteklemiyor. Ayrıntılı bilgi için http://en.wikipedia.org/wiki/Favicon

Hazır yazılmış PHP sınıfı ya da fonksiyonu bir tek http://phpthumb.sourceforge.net/ adresinde buldum.
Çok fazla özellik içeriyor ayrıca projelerimizde bunun yerine kullandığımız küçültme sınıfları var.
Sonuç olarak sadece gerekli olanları kullanarak aşağıdaki kodu oluşturdum.

Kullanımı:

img2ico("icon1.jpg", "icon1.ico");
img2ico("icon2.gif", "icon2.ico");
img2ico("icon3.png", "icon3.ico");

icon.php

function img2ico($file, $ico)
{
    $type = exif_imagetype($file);
 
    switch ($type)
    {
        case IMAGETYPE_GIF:
            $im = imagecreatefromgif($file);
            break;
        case IMAGETYPE_JPEG:
            $im = imagecreatefromjpeg($file);
            break;
        case IMAGETYPE_PNG:
            $im = imagecreatefrompng($file);
            break;
    }
 
    if (isset($im)) {
        $ima = array($im);
        $gd = GD2ICOstring($ima);
        file_put_contents($ico, $gd);
    }
}
 
function GD2ICOstring(&$gd_image_array)
{
    foreach ($gd_image_array as $key => $gd_image) {
 
        $ImageWidths[$key] = ImageSX($gd_image);
 
        $ImageHeights[$key] = ImageSY($gd_image);
        $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24;
        $totalcolors[$key] = ImageColorsTotal($gd_image);
 
        $icXOR[$key] = '';
        for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
            for ($x = 0; $x < $ImageWidths[$key]; $x++) {
                $argb = GetPixelColor($gd_image, $x, $y);
                $a = round(255 * ((127 - $argb['alpha']) / 127));
                $r = $argb['red'];
                $g = $argb['green'];
                $b = $argb['blue'];
 
                if ($bpp[$key] == 32) {
                    $icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
                } elseif ($bpp[$key] == 24) {
                    $icXOR[$key] .= chr($b) . chr($g) . chr($r);
                }
                $icANDmask = array();
                if ($a < 128) {
                    @$icANDmask[$key][$y] .= '1';
                } else {
                    @$icANDmask[$key][$y] .= '0';
                }
            }
            // mask bits are 32-bit aligned per scanline
            while (strlen($icANDmask[$key][$y]) % 32) {
                $icANDmask[$key][$y] .= '0';
            }
        }
        $icAND[$key] = '';
        foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
            for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
                $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, '0', STR_PAD_LEFT)));
            }
        }
 
    }
 
    foreach ($gd_image_array as $key => $gd_image) {
        $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
 
        // BITMAPINFOHEADER - 40 bytes
        $BitmapInfoHeader[$key] = '';
        $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00"; // DWORD  biSize;
        $BitmapInfoHeader[$key] .= LittleEndian2String($ImageWidths[$key], 4); // LONG   biWidth;
        // The biHeight member specifies the combined
        // height of the XOR and AND masks.
        $BitmapInfoHeader[$key] .= LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
        $BitmapInfoHeader[$key] .= "\x01\x00"; // WORD   biPlanes;
        $BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00"; // wBitCount;
        $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biCompression;
        $BitmapInfoHeader[$key] .= LittleEndian2String($biSizeImage, 4); // DWORD  biSizeImage;
        $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG   biXPelsPerMeter;
        $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG   biYPelsPerMeter;
        $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biClrUsed;
        $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biClrImportant;
    }
 
 
    $icondata = "\x00\x00"; // idReserved;   // Reserved (must be 0)
    $icondata .= "\x01\x00"; // idType;       // Resource Type (1 for icons)
    $icondata .= LittleEndian2String(count($gd_image_array), 2); // idCount;      // How many images?
 
    $dwImageOffset = 6 + (count($gd_image_array) * 16);
    foreach ($gd_image_array as $key => $gd_image) {
        // ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
 
        $icondata .= chr($ImageWidths[$key]); // bWidth;          // Width, in pixels, of the image
        $icondata .= chr($ImageHeights[$key]); // bHeight;         // Height, in pixels, of the image
        $icondata .= chr($totalcolors[$key]); // bColorCount;     // Number of colors in image (0 if >=8bpp)
        $icondata .= "\x00"; // bReserved;       // Reserved ( must be 0)
 
        $icondata .= "\x01\x00"; // wPlanes;         // Color Planes
        $icondata .= chr($bpp[$key]) . "\x00"; // wBitCount;       // Bits per pixel
 
        $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
        $icondata .= LittleEndian2String($dwBytesInRes, 4); // dwBytesInRes;    // How many bytes in this resource?
 
        $icondata .= LittleEndian2String($dwImageOffset, 4); // dwImageOffset;   // Where in the file is this image?
        $dwImageOffset += strlen($BitmapInfoHeader[$key]);
        $dwImageOffset += strlen($icXOR[$key]);
        $dwImageOffset += strlen($icAND[$key]);
    }
 
    foreach ($gd_image_array as $key => $gd_image) {
        $icondata .= $BitmapInfoHeader[$key];
        $icondata .= $icXOR[$key];
        $icondata .= $icAND[$key];
    }
 
    return $icondata;
}
 
function GetPixelColor(&$img, $x, $y)
{
    if (!is_resource($img)) {
        return false;
    }
    return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
}
 
function LittleEndian2String($number, $minbytes = 1)
{
    $intstring = '';
    while ($number > 0) {
        $intstring = $intstring . chr($number & 255);
        $number >>= 8;
    }
    return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
}

Php: error_reporting neden hataları göstermez

Genel Yorum Yok »

error_reporting php.ini dosyasında display_errors kapalı olarak ayarlanmış hataları ekrana basmıyor.
Bunu çözümü ini_set ile display_errors ayarını On yapmak.

ini_set('display_errors','On');
ini_set('error_reporting', E_ALL);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

json_encode Türkçe karakter çözümü

Genel 2 Yorum »

Bilindiği üzere artık bir çok uyumluluk sorununu aşmak için karakter kodlaması olarak UTF-8 kullanmak gerekiyor.
json_encode fonksiyonuna ANSI kodlanmış Türkçe karakter gönderildiğinde fonksiyon hata verip ilgili girdiyi dönüştürmüyor. Bunun nedeni json_encode sadece UTF-8 karakter kodlamasının desteklemesi.

Bunun çözümü aslında çok kolay iconv kullanmak.

Yeni fonksiyon;

1
2
3
4
5
6
7
8
9
10
11
function jsn_encode($array,$input="ISO-8859-9")
{
    function encode(&$item, $key)
    {
        global $input;
        $item = iconv($input,"UTF-8",$item);
    }
 
    array_walk_recursive($array, 'encode');
    return json_encode( $array );
}

Örnek kod;

1
2
3
4
5
6
$array[] = array('1' => 'ĞÜŞİÇÖ');
$array[] = array('2' => 'Yazı');
$array[] = array('3' => 'Türkçe');
 
 
echo jsn_encode($array);

Çıktı

1
[{"1":"\u011e\u00dc\u015e\u0130\u00c7\u00d6"},{"2":"Yaz\u0131"},{"3":"T\u00fcrk\u00e7e"}]

PHP ile Türkçe Karakter Sıralama

Genel 3 Yorum »

Kod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$harf = "AaBbCcÇçDdEeFfGgĞğHhIıİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz";
$harfler = str_split($harf,1);
 
function turkcesirala($a,$b)
{
    global $harfler;
    $ha = array_search(substr($a,0,1),$harfler);
    $hb = array_search(substr($b,0,1),$harfler);
    if($ha >= $hb) return true; else return false;
}
 
$yazarlar = array("Öküz"=>1,"At"=>2,"Çeşit"=>3,"Zeytin"=>4,"Ğeviş"=>5,"Gev"=>6);
 
uksort($yazarlar,"turkcesirala");
 
var_export($yazarlar);

Sonuç:

1
2
3
4
5
6
7
8
array (
  'At' => 2,
  'Çeşit' => 3,
  'Gev' => 6,
  'ÄževiÅŸ' => 5,
  'Öküz' => 1,
  'Zeytin' => 4,
)

Güncelleme: Sadece ilk karakterlerin sırasının önemli olduÄŸu bir yerde kullanılmak için yazılmıştır. Ömer ÜÇEL’in belirttiÄŸi ÅŸekilde kullanılırsa tüm karakterler göz önüne alınarak sıralayacaktır.

Kod:

1
2
3
setlocale(LC_ALL, 'tr_TR.UTF-8');
$yazarlar = array("Öküz"=>1,"At"=>2,"Çeşit"=>3,"Zeytin"=>4,"Ğeviş"=>5,"Gev"=>6);
ksort($yazarlar, SORT_LOCALE_STRING);

Bir Metindeki Adresleri Linke Çevirmek

Genel 1 Yorum »

Bir arkadaşın ihtiyacı için bulup buluşturduğum bir kod parçası

Kullanılan regexp cümleciği

1
@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@

Örnek kod

1
2
3
4
5
6
$string='deneme olarak http://sayfa.site.com/goster/icerik.html
bu linki ve http://sayfa.site.com/sakla/icerik.html sadece
yazı içinden alıp link yapacak.';
 
$string = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', 
'<a href="$1">$1</a>', $string);

Örnek kodun çıktısı

1
2
3
deneme olarak <a href="http://sayfa.site.com/goster/icerik.html">http://sayfa.site.com/goster/icerik.html</a>
bu linki ve <a href="http://sayfa.site.com/sakla/icerik.html">http://sayfa.site.com/sakla/icerik.html</a> sadece
yazı içinden alıp link yapacak.

JQuery ile RSS besleme okuma

Genel 3 Yorum »

Aşağıdaki basit kod parçacığı jquery ajax ile rss beslemesini okumak için yazdım. Bir süredir JQuery kullanıyorum. Yine de javascript için tam olarak bir kütüphane(framework de denebilir) kullanmaya alışamadım. class metodlarını kullanarak sayfa içine yerleştirmek mümkün. İlerleyen zamanda onu da yazarım inşallah :-D

1
2
3
4
5
6
7
8
9
10
$.ajax({
    type: "GET",
    url: "xml.php?dosya=forum",//wiki.xml
    dataType: "xml",
    success: function(xml) {
		$(xml).find('item').each(function(){
			$("#cikti").html($("#cikti").html()+"<br /><a href='"+$('link',this).text()+"' target='_blank'>"+$('title',this).text()+"</a>");
		});
   }
});

Güvenlik nedeniyle mevcut alanadı dışından veri okumaya çalıştığınızda tarayıcı hata veriyor( En azındna firefox veriyor). Bunun önüne geçmek için aşağıdaki gibi basit bir kod iş görüyor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< ?php
$_D = array_key_exists("dosya",$_GET) ? $_GET['dosya'] : "wiki";
 
$dosya = array();
$dosya['wiki'] = "http://wiki.linux-sevenler.org/index.php?title=%C3%96zel:Recentchanges&feed=rss";
$dosya['forum'] = "http://forum.linux-sevenler.org/index.php?PHPSESSID=5bfa9a80662d4857224d9a122299d288&type=rss;action=.xml";
 
if(array_key_exists($_D,$dosya))
{
	$xml = implode("\n", file($dosya[$_D]));
	header("Content-Type: text/xml");
	echo $xml;
}else
{
	echo hata;
}
?>

Not: Ayrıntılı yazmak isterdim ama vakit ancak bu kadarına yetti.

PHP Merkez Bankası Döviz Kuru

Genel 3 Yorum »

Kod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$para = array(	"USD/TRY","AUD/TRY","DKK/TRY",
				"EUR/TRY","GBP/TRY","CHF/TRY",
				"SEK/TRY","CAD/TRY","KWD/TRY",
				"NOK/TRY","SAR/TRY","JPY/TRY",
				"BGL/TRY","SYP/TRY","JOD/TRY",
				"ILS/TRY","RON/TRY","IRR/TRY");
$dosya=file("http://www.tcmb.gov.tr/kurlar/today.html?");
for($i=0;$i < count($dosya);$i++)
{
	for($j=0; $j < count($para) ; $j++)
	{
		if(ereg($para[$j], $dosya[$i])) {
		$temp = split("[[:space:]]{2,}" , $dosya[$i]);
			$t = $temp[0];
			for($k=0; $k < count($temp); $k++)
				$cikti[$t][$k] = $temp[$k]; 
		}
	}
}
//print_r($cikti);

Çıktı:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Array
(
    [USD/TRY] => Array
        (
            [0] => USD/TRY
            [1] => 1 ABD DOLARI
            [2] => 1.1640
            [3] => 1.1696
            [4] => 1.1632
            [5] => 1.1714
 
        )
 
    [AUD/TRY] => Array
        (
            [0] => AUD/TRY
            [1] => 1 AVUSTRALYA DOLARI
            [2] => 1.0511
            [3] => 1.0580
            [4] => 1.0463
            [5] => 1.0643
 
        )
...
WP Theme & Icons by N.Design Studio
Girdi Beslemesi Yorum Beslemesi GiriÅŸ