[help] прозрачность png в IE 6 функция для dle

Тема в разделе "DLE", создана пользователем gruppastimul, 1 май 2008.

Информация :
Актуальная версия DataLife Engine 11.2
( Final Release v.11.2 | Скачать DataLife Engine | Скачать 11.2 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.1 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    Есть функция обрабатывает картинки png, у которых указаны размеры, а также свойства background-image в CSS для нормального отображения в IE 6 графики png.

    PHP:

    function replacePngTags($x,$img_path='',$sizeMeth='scale',$inScript=FALSE){
        
    $arr2=array();
        
    // make sure that we are only replacing for the Windows versions of Internet
        // Explorer 5.5+
        
    $msie='/msie\s(5\.[5-9]|[6]\.[0-9]*).*(win)/i';
        if( !isset(
    $_SERVER['HTTP_USER_AGENT']) ||
            !
    preg_match($msie,$_SERVER['HTTP_USER_AGENT']) ||
            
    preg_match('/opera/i',$_SERVER['HTTP_USER_AGENT']))
            return 
    $x;

        if(
    $inScript){
            
    // first, I want to remove all scripts from the page...
            
    $saved_scripts=array();
            
    $placeholders=array();
            
    preg_match_all('`<script[^>]*>(.*)</script>`isU',$x,$scripts);
            for(
    $i=0;$i<count($scripts[0]);$i++){
                
    $x=str_replace($scripts[0][$i],'replacePngTags_ScriptTag-'.$i,$x);
                
    $saved_scripts[]=$scripts[0][$i];
                
    $placeholders[]='replacePngTags_ScriptTag-'.$i;
            }
        }

        
    // find all the png images in backgrounds
        
    preg_match_all('/background-image:\s*url\(([\\"\\\']?)([^\)]+\.png)\1\);/Uis',$x,$background);
        for(
    $i=0;$i<count($background[0]);$i++){
            
    // simply replace:
            //  "background-image: url('image.png');"
            // with:
            //  "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
            //      enabled=true, sizingMethod=scale, src='image.png');"
            // I don't think that the background-repeat styles will work with this...
            
    $x=str_replace($background[0][$i],'filter:progid:DXImageTransform.'.
                    
    'Microsoft.AlphaImageLoader(enabled=true, sizingMethod='.$sizeMeth.
                    
    ', src=\''.$background[2][$i].'\');',$x);
        }

        
    // find all the IMG tags with ".png" in them
        
    $pattern='/<(input|img)[^>]*src=([\\"\\\']?)([^>]*\.png)\2[^>]*>/i';
        
    preg_match_all($pattern,$x,$images);
        for(
    $num_images=0;$num_images<count($images[0]);$num_images++){
            
    // for each found image pattern
            
    $original=$images[0][$num_images];
            
    $quote=$images[2][$num_images];
            
    $atts=''$width=0$height=0$modified=$original;

            
    // We do this so that we can put our spacer.png image in the same
            // directory as the image - if a path wasn't passed to the function
            
    if(empty($img_path)){
                
    $tmp=split('[\\/]',$images[3][$num_images]);
                
    $this_img=array_pop($tmp);
                
    $img_path=join('/',$tmp);
                if(empty(
    $img_path)){
                    
    // this was a relative URI, image should be in this directory
                    
    $tmp=split('[\\/]',$_SERVER['SCRIPT_NAME']);
                    
    array_pop($tmp);    // trash the script name, we only want the directory name
                    
    $img_path=join('/',$tmp).'/';
                }else{
                    
    $img_path.='/';
                }
            }else if(
    substr($img_path,-1)!='/'){
                
    // in case the supplied path didn't end with a /
                
    $img_path.='/';
            }

            
    // If the size is defined by styles, find them
            
    preg_match_all(
                
    '/style=([\\"\\\']).*(\s?width:\s?([0-9]+(px|%));).*'.
                
    '(\s?height:\s?([0-9]+(px|%));).*\\1/Ui',
                   
    $images[0][$num_images],$arr2);
            if(
    is_array($arr2) && count($arr2[0])){
                
    // size was defined by styles, get values
                
    $width=$arr2[3][0];
                
    $height=$arr2[6][0];

                
    // remove the width and height from the style
                
    $stripper=str_replace(' ','\s','/('.$arr2[2][0].'|'.$arr2[5][0].')/');
                
    // Also remove any empty style tags
                
    $modified=preg_replace(
                    
    '`style='.$arr2[1][0].$arr2[1][0].'`i',
                    
    '',
                    
    preg_replace($stripper,'',$modified));
            }else{
                
    // size was not defined by styles, get values from attributes
                
    preg_match_all('/width=([\\"\\\']?)([0-9%]+)\\1/i',$images[0][$num_images],$arr2);
                if(
    is_array($arr2) && count($arr2[0])){
                    
    $width=$arr2[2][0];
                    if(
    is_numeric($width))
                        
    $width.='px';

                    
    // remove width from the tag
                    
    $modified=str_replace($arr2[0][0],'',$modified);
                }
                
    preg_match_all('/height=([\\"\\\']?)([0-9%]+)\\1/i',$images[0][$num_images],$arr2);
                if(
    is_array($arr2) && count($arr2[0])){
                    
    $height=$arr2[2][0];
                    if(
    is_numeric($height))
                        
    $height.='px';

                    
    // remove height from the tag
                    
    $modified=str_replace($arr2[0][0],'',$modified);
                }
            }

            if(
    $width==|| $height==0){
                
    // width and height not defined in HTML attributes or css style, try to get
                // them from the image itself
                // this does not work in all conditions... It is best to define width and
                // height in your img tag or with inline styles..
                
    if(file_exists($_SERVER['DOCUMENT_ROOT'].$img_path.$images[3][$num_images])){
                    
    // image is on this filesystem, get width & height
                    
    $size=getimagesize($_SERVER['DOCUMENT_ROOT'].$img_path.$images[3][$num_images]);
                    
    $width=$size[0].'px';
                    
    $height=$size[1].'px';
                }else if(
    file_exists($_SERVER['DOCUMENT_ROOT'].$images[3][$num_images])){
                    
    // image is on this filesystem, get width & height
                    
    $size=getimagesize($_SERVER['DOCUMENT_ROOT'].$images[3][$num_images]);
                    
    $width=$size[0].'px';
                    
    $height=$size[1].'px';
                }
            }

            
    // end quote is already supplied by originial src attribute
            
    $replace_src_with=$quote.$img_path.'spacer.png'.$quote.' style="width: '.$width.
                
    '; height: '.$height.'; filter: progid:DXImageTransform.'.
                
    'Microsoft.AlphaImageLoader(src=\''.$images[3][$num_images].'\', sizingMethod='.
                
    $sizeMeth.');"';

            
    // now create the new tag from the old
            
    $new_tag=str_replace($quote.$images[3][$num_images].$quote,$replace_src_with,
                
    str_replace('  ',' ',$modified));
            
    // now place the new tag into the content
            
    $x=str_replace($original,$new_tag,$x);
        }

        if(
    $inScript){
            
    // before the return, put the script tags back in. (I was having problems when there was
            // javascript that had image tags for PNGs in it when using this function...
            
    $x=str_replace($placeholders,$saved_scripts,$x);
        }

        return 
    $x;
    }

    Перед тем, как отослать страницу клиенту пропускаем ее через эту функцию. В резальтате мы имеем исправленные png. Куда вставить эту функцию в DLE, чтобы функция заработала ))
     
  2. PoMaH

    PoMaH

    Регистр.:
    8 июн 2006
    Сообщения:
    753
    Симпатии:
    142
    vozmozno v index.php v samom konce pered echo $tpl->result['main'];
    Код:
    $tpl->result['main'] = replacePngTags($tpl->result['main']);
    
    
    ili

    Код:
    zamenit echo na 
    
    echo replacePngTags($tpl->result['main']);
    
    
     
  3. DoomBoom

    DoomBoom Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    44
    Симпатии:
    27
    Да это делается гораздо проще, просто ПНГ фикс...
     
  4. PoMaH

    PoMaH

    Регистр.:
    8 июн 2006
    Сообщения:
    753
    Симпатии:
    142
    no jesli u tebia celaja kucia kartinok, i zahodit ktonit s pc istoriceskim, to tvoi png java fix, zalomajet browser...
     
  5. shisha

    shisha Прохожие

    Второго поста я не понел полностью как и целиком ПНГ фикс??? что за бред ПНГ 32 формат уже старенький и его давно не фиксят, а так вещь не скоть без полезная да и работает не всегда, самый простой способ просто поставить браузер с обработкай PNG 32 к примеру тотже IE 7.0 еще заметка номер два Опера обрабатывает PNG 32 Для просмотра нормально но если заливать файлы 32 с активным Alpha каналом то картинка портится илиже альфа канал приобретает старый оттенок поэтому лучше при залифки ПНГ картинок с активным алфа он же просто прозрачность, полупрозрачность и тп лучше использовать IE или же Firefox потому как повторюсь при посылки нас через скрипт используя Opera мы теряем альфа и в итоге имеем место PNG 32 подобие PNG 24.

    И П.С. IE не поддерживает альфа канал от пнг 32 поэтому данный фикс вообще не пашет, если что и надо фиксить так это IE 6.0 -
     
  6. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    а вы не в курсе что до сих пор IE6 юзает больше народу чем ие 7 оперу и файрфокс? вот ссылка на статистику http://www.liveinternet.ru/stat/ru/browsers.html?date=2008-04-30 для этого и нужно - а фиксы не прокаывают в полупрозрачности.
     
  7. JC

    JC Бог пикселей

    Регистр.:
    4 янв 2008
    Сообщения:
    303
    Симпатии:
    401
    gruppastimul, еще как ПНГ фикс помогает, их просто есть много... Смотря какой ты юзал
     
  8. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    нужно чтобы обрабатывал img - потом background - полупрозрачность - все без размеров тоесть бекграунд с повторением - и поверх бекграунда текст или ссылки...
     
Статус темы:
Закрыта.