[ Index ]
 

Code source de LifeType 1.2.4

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/class/gallery/getid3/ -> module.graphic.pcd.php (source)

   1  <?php
   2  /////////////////////////////////////////////////////////////////
   3  /// getID3() by James Heinrich <info@getid3.org>               //
   4  //  available at http://getid3.sourceforge.net                 //
   5  //            or http://www.getid3.org                         //
   6  /////////////////////////////////////////////////////////////////
   7  // See readme.txt for more details                             //
   8  /////////////////////////////////////////////////////////////////
   9  //                                                             //
  10  // module.graphic.pcd.php                                      //
  11  // module for analyzing PhotoCD (PCD) Image files              //
  12  // dependencies: NONE                                          //
  13  //                                                            ///
  14  /////////////////////////////////////////////////////////////////
  15  
  16  
  17  class getid3_pcd
  18  {
  19  	function getid3_pcd(&$fd, &$ThisFileInfo, $ExtractData=0) {
  20          $ThisFileInfo['fileformat']          = 'pcd';
  21          $ThisFileInfo['video']['dataformat'] = 'pcd';
  22          $ThisFileInfo['video']['lossless']   = false;
  23  
  24  
  25          fseek($fd, $ThisFileInfo['avdataoffset'] + 72, SEEK_SET);
  26  
  27          $PCDflags = fread($fd, 1);
  28          $PCDisVertical = ((ord($PCDflags) & 0x01) ? true : false);
  29  
  30  
  31          if ($PCDisVertical) {
  32              $ThisFileInfo['video']['resolution_x'] = 3072;
  33              $ThisFileInfo['video']['resolution_y'] = 2048;
  34          } else {
  35              $ThisFileInfo['video']['resolution_x'] = 2048;
  36              $ThisFileInfo['video']['resolution_y'] = 3072;
  37          }
  38  
  39  
  40          if ($ExtractData > 3) {
  41  
  42              $ThisFileInfo['error'][] = 'Cannot extract PSD image data for detail levels above BASE (3)';
  43  
  44          } elseif ($ExtractData > 0) {
  45  
  46              $PCD_levels[1] = array( 192,  128, 0x02000); // BASE/16
  47              $PCD_levels[2] = array( 384,  256, 0x0B800); // BASE/4
  48              $PCD_levels[3] = array( 768,  512, 0x30000); // BASE
  49              //$PCD_levels[4] = array(1536, 1024,    ??); // BASE*4  - encrypted with Kodak-proprietary compression/encryption
  50              //$PCD_levels[5] = array(3072, 2048,    ??); // BASE*16 - encrypted with Kodak-proprietary compression/encryption
  51              //$PCD_levels[6] = array(6144, 4096,    ??); // BASE*64 - encrypted with Kodak-proprietary compression/encryption; PhotoCD-Pro only
  52  
  53              list($PCD_width, $PCD_height, $PCD_dataOffset) = $PCD_levels[3];
  54  
  55              fseek($fd, $ThisFileInfo['avdataoffset'] + $PCD_dataOffset, SEEK_SET);
  56  
  57              for ($y = 0; $y < $PCD_height; $y += 2) {
  58                  // The image-data of these subtypes start at the respective offsets of 02000h, 0b800h and 30000h.
  59                  // To decode the YcbYr to the more usual RGB-code, three lines of data have to be read, each
  60                  // consisting of ‘w’ bytes, where ‘w’ is the width of the image-subtype. The first ‘w’ bytes and
  61                  // the first half of the third ‘w’ bytes contain data for the first RGB-line, the second ‘w’ bytes
  62                  // and the second half of the third ‘w’ bytes contain data for a second RGB-line.
  63  
  64                  $PCD_data_Y1 = fread($fd, $PCD_width);
  65                  $PCD_data_Y2 = fread($fd, $PCD_width);
  66                  $PCD_data_Cb = fread($fd, intval(round($PCD_width / 2)));
  67                  $PCD_data_Cr = fread($fd, intval(round($PCD_width / 2)));
  68  
  69                  for ($x = 0; $x < $PCD_width; $x++) {
  70                      if ($PCDisVertical) {
  71                          $ThisFileInfo['pcd']['data'][$PCD_width - $x][$y]     = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)}));
  72                          $ThisFileInfo['pcd']['data'][$PCD_width - $x][$y + 1] = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)}));
  73                      } else {
  74                          $ThisFileInfo['pcd']['data'][$y][$x]                  = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)}));
  75                          $ThisFileInfo['pcd']['data'][$y + 1][$x]              = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)}));
  76                      }
  77                  }
  78              }
  79  
  80              // Example for plotting extracted data
  81              //getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true);
  82              //if ($PCDisVertical) {
  83              //    $BMPinfo['resolution_x'] = $PCD_height;
  84              //    $BMPinfo['resolution_y'] = $PCD_width;
  85              //} else {
  86              //    $BMPinfo['resolution_x'] = $PCD_width;
  87              //    $BMPinfo['resolution_y'] = $PCD_height;
  88              //}
  89              //$BMPinfo['bmp']['data'] = $ThisFileInfo['pcd']['data'];
  90              //getid3_bmp::PlotBMP($BMPinfo);
  91              //exit;
  92  
  93          }
  94  
  95      }
  96  
  97  	function YCbCr2RGB($Y, $Cb, $Cr) {
  98          static $YCbCr_constants = array();
  99          if (empty($YCbCr_constants)) {
 100              $YCbCr_constants['red']['Y']    =  0.0054980 * 256;
 101              $YCbCr_constants['red']['Cb']   =  0.0000000 * 256;
 102              $YCbCr_constants['red']['Cr']   =  0.0051681 * 256;
 103              $YCbCr_constants['green']['Y']  =  0.0054980 * 256;
 104              $YCbCr_constants['green']['Cb'] = -0.0015446 * 256;
 105              $YCbCr_constants['green']['Cr'] = -0.0026325 * 256;
 106              $YCbCr_constants['blue']['Y']   =  0.0054980 * 256;
 107              $YCbCr_constants['blue']['Cb']  =  0.0079533 * 256;
 108              $YCbCr_constants['blue']['Cr']  =  0.0000000 * 256;
 109          }
 110  
 111          $RGBcolor = array('red'=>0, 'green'=>0, 'blue'=>0);
 112          foreach ($RGBcolor as $rgbname => $dummy) {
 113              $RGBcolor[$rgbname] = max(0,
 114                                          min(255,
 115                                              intval(
 116                                                  round(
 117                                                      ($YCbCr_constants[$rgbname]['Y'] * $Y) +
 118                                                      ($YCbCr_constants[$rgbname]['Cb'] * ($Cb - 156)) +
 119                                                      ($YCbCr_constants[$rgbname]['Cr'] * ($Cr - 137))
 120                                                  )
 121                                              )
 122                                          )
 123                                      );
 124          }
 125          return (($RGBcolor['red'] * 65536) + ($RGBcolor['green'] * 256) + $RGBcolor['blue']);
 126      }
 127  
 128  }
 129  
 130  ?>


Généré le : Mon Nov 26 21:04:15 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics