Foros del Web » Programando para Internet » PHP »

Thumbnail de archivos ABR

Estas en el tema de Thumbnail de archivos ABR en el foro de PHP en Foros del Web. Buenas: Alquien sabe como podria obtener un thumbnail de un archivo ABR que es un pincel de photoshop... Gracias...
  #1 (permalink)  
Antiguo 16/12/2009, 15:26
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Thumbnail de archivos ABR

Buenas:
Alquien sabe como podria obtener un thumbnail de un archivo ABR que es un pincel de photoshop...

Gracias
  #2 (permalink)  
Antiguo 16/12/2009, 16:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnail de archivos ABR

con las herramientas actuales dudo mucho que se pueda, ya que es un formato propietario de Adobe

lo único que puedes hacer es exportar la brocha como imagen estándar, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 16/12/2009, 16:53
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Thumbnail de archivos ABR

Cita:
Iniciado por pateketrueke Ver Mensaje
con las herramientas actuales dudo mucho que se pueda, ya que es un formato propietario de Adobe

lo único que puedes hacer es exportar la brocha como imagen estándar, suerte!!
Hombre yo creo que alguna forma debe de haver, PSD tambien es un formato de ADOBE y en cambio yo tengo clases en php que me los permite ver en mi pagina web...

supongo que solo hay que saber como esta compuesto el archivo no?
y debe de ser publico ya que hay un programa que se llama abrviewer en el que puedes ver los pinceles y no es de adobe...

Gracias
  #4 (permalink)  
Antiguo 16/12/2009, 17:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnail de archivos ABR

Cita:
Iniciado por scorpionhack Ver Mensaje
[...] supongo que solo hay que saber como esta compuesto el archivo no? [...]
me imagino que tienes razón... cuando encuentres como no olvides aportarlo, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 16/12/2009, 17:19
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Thumbnail de archivos ABR

Cita:
Iniciado por pateketrueke Ver Mensaje
me imagino que tienes razón... cuando encuentres como no olvides aportarlo, suerte!!
para eso toy aqui haver si alguien tiene por lo menos una pista...
  #6 (permalink)  
Antiguo 16/12/2009, 17:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnail de archivos ABR

una pista??

- Google...

no entiendo porque preguntar al foro primero... es como si esperaras a que alguien haga la investigación por ti, pero bueno...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 16/12/2009, 17:42
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Thumbnail de archivos ABR

Cita:
Iniciado por pateketrueke Ver Mensaje
una pista??

- Google...

no entiendo porque preguntar al foro primero... es como si esperaras a que alguien haga la investigación por ti, pero bueno...

Primera de todas...Busca y luego juzga verás que en google no sale nada ;)

siempre me gusta sacarme las castañas del fuego y el foro es mi ultimo recurso...
  #8 (permalink)  
Antiguo 16/12/2009, 18:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnail de archivos ABR

pues si, ya he buscado y fue desde el primer post...

solo que no me gusta investigar lo que no me corresponde, osea...

tu crees que si alguien ya tuviera la respuesta o un tema similar en el foro... ¿no saldría en las búsquedas de Google??

se que para obtener buenos resultados hay que saber buscar, pero ese no es mi trabajo... si simple y sencillamente no hay mas información en Internet... ¿porque ir a preguntar en este foro?? (sabiendo que es popular, y siempre anda en los primeros lugares de resultados)

NOTA que si ya conoces un software, o tiene algo investigado continúa por ahí... o para la próxima anticipa que ya has investigado porque con la simple pregunta ¿alguien sabe? ¿se puede hacer?? ¡pues no se llega a ningún lado!!!


sin animo de ofender, no es que tu pregunta este mal hecha y no sea "inteligente"... pero definitivamente es incompleta y de ahí derivan los problemas, por favor: como hacer preguntas inteligentes
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 16/12/2009, 18:25
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Thumbnail de archivos ABR

No tranquilo no me ofendes..

¿por que lo he puesto en un foro de PHP? por que el que no encuentre algo en internet no significa que no se pueda hacer, posiblemente haya alguien que sepa como averiguar esa informacion que a mi me falta para poder leer los pinceles y que no este en internet...

Por ejemplo hace unas semanas queria hacer un programa que me mostrara un PSD con visual basic, y no tenia ni p*** idea...

pues gracias a que encontre esta clase en internet de php pude averiguar como hacerlo en visual basic...

con esto quiero decir que aveces no hace falta que te indiquen el final del camino con que te indiquen el pricipio es de gran ayuda...

PD: aprovecho y dejo la clase de php por aqui...

Código PHP:
class PhpPsdReader {
    var 
$infoArray;
    var 
$fp;
    var 
$fileName;
    var 
$tempFileName;
    var 
$colorBytesLength;

    function 
PhpPsdReader($fileName) {
        
set_time_limit(0);
        
$this->infoArray = array();
        
$this->fileName $fileName;
        
$this->fp fopen($this->fileName,'r');

        if (
fread($this->fp,4)=='8BPS') {
            
$this->infoArray['version id'] = $this->_getInteger(2);
            
fseek($this->fp,6,SEEK_CUR); // 6 bytes of 0's
            
$this->infoArray['channels'] = $this->_getInteger(2);
            
$this->infoArray['rows'] = $this->_getInteger(4);
            
$this->infoArray['columns'] = $this->_getInteger(4);
            
$this->infoArray['colorDepth'] = $this->_getInteger(2);
            
$this->infoArray['colorMode'] = $this->_getInteger(2);


            
/* COLOR MODE DATA SECTION */ //4bytes Length The length of the following color data.
            
$this->infoArray['colorModeDataSectionLength'] = $this->_getInteger(4);
            
fseek($this->fp,$this->infoArray['colorModeDataSectionLength'],SEEK_CUR); // ignore this snizzle

            /*  IMAGE RESOURCES */
            
$this->infoArray['imageResourcesSectionLength'] = $this->_getInteger(4);
            
fseek($this->fp,$this->infoArray['imageResourcesSectionLength'],SEEK_CUR); // ignore this snizzle

            /*  LAYER AND MASK */
            
$this->infoArray['layerMaskDataSectionLength'] = $this->_getInteger(4);
            
fseek($this->fp,$this->infoArray['layerMaskDataSectionLength'],SEEK_CUR); // ignore this snizzle


            /*  IMAGE DATA */
            
$this->infoArray['compressionType'] = $this->_getInteger(2);
            
$this->infoArray['oneColorChannelPixelBytes'] = $this->infoArray['colorDepth']/8;
            
$this->colorBytesLength $this->infoArray['rows']*$this->infoArray['columns']*$this->infoArray['oneColorChannelPixelBytes'];

            if (
$this->infoArray['colorMode']==2) {
                
$this->infoArray['error'] = 'images with indexed colours are not supported yet';
                return 
false;
            }
        } else {
            
$this->infoArray['error'] = 'invalid or unsupported psd';
            return 
false;
        }
    }


    function 
getImage() {
        
// decompress image data if required
        
switch($this->infoArray['compressionType']) {
            
// case 2:, case 3: zip not supported yet..
            
case 1:
                
// packed bits
                
$this->infoArray['scanLinesByteCounts'] = array();
                for (
$i=0$i<($this->infoArray['rows']*$this->infoArray['channels']); $i++) $this->infoArray['scanLinesByteCounts'][] = $this->_getInteger(2);
                
$this->tempFileName tempnam(realpath('/tmp'),'decompressedImageData');
                
$tfp fopen($this->tempFileName,'wb');
                foreach (
$this->infoArray['scanLinesByteCounts'] as $scanLinesByteCount) {
                    
fwrite($tfp,$this->_getPackedBitsDecoded(fread($this->fp,$scanLinesByteCount)));
                }
                
fclose($tfp);
                
fclose($this->fp);
                
$this->fp fopen($this->tempFileName,'r');
            default:
                
// continue with current file handle;
                
break;
        }

        
// let's write pixel by pixel....
        
$image imagecreatetruecolor($this->infoArray['columns'],$this->infoArray['rows']);

        for (
$rowPointer 0; ($rowPointer $this->infoArray['rows']); $rowPointer++) {
            for (
$columnPointer 0; ($columnPointer $this->infoArray['columns']); $columnPointer++) {
                
/*     The color mode of the file. Supported values are: Bitmap=0;
                    Grayscale=1; Indexed=2; RGB=3; CMYK=4; Multichannel=7;
                    Duotone=8; Lab=9.
                */
                
switch ($this->infoArray['colorMode']) {
                    case 
2// indexed... info should be able to extract from color mode data section. not implemented yet, so is grayscale
                        
exit;
                        break;
                    case 
0:
                        
// bit by bit
                        
if ($columnPointer == 0$bitPointer 0;
                        if (
$bitPointer==0$currentByteBits str_pad(base_convert(bin2hex(fread($this->fp,1)), 162),8,'0',STR_PAD_LEFT);
                        
$r $g $b = (($currentByteBits[$bitPointer]=='1')?0:255);
                        
$bitPointer++;
                        if (
$bitPointer==8$bitPointer 0;
                        break;

                    case 
1:
                    case 
8// 8 is indexed with 1 color..., so grayscale
                        
$r $g $b $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        break;

                    case 
4// CMYK
                        
$c $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
$currentPointerPos ftell($this->fp);
                        
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                        
$m $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                        
$y $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                        
$k $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
fseek($this->fp,$currentPointerPos);
                        
$r round(($c $k) / (pow(2,$this->infoArray['colorDepth'])-1));
                        
$g round(($m $k) / (pow(2,$this->infoArray['colorDepth'])-1));
                        
$b round(($y $k) / (pow(2,$this->infoArray['colorDepth'])-1));

                          break;

                          case 
9// hunter Lab
                              // i still need an understandable lab2rgb convert algorithm... if you have one, please let me know!
                            
$l $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                            
$currentPointerPos ftell($this->fp);
                            
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                            
$a $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                            
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                            
$b =  $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                            
fseek($this->fp,$currentPointerPos);

                            
$r $l;
                            
$g $a;
                            
$b $b;

                        break;
                    default:
                        
$r $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
$currentPointerPos ftell($this->fp);
                        
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                        
$g $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
fseek($this->fp,$this->colorBytesLength-1,SEEK_CUR);
                        
$b =  $this->_getInteger($this->infoArray['oneColorChannelPixelBytes']);
                        
fseek($this->fp,$currentPointerPos);
                        break;

                }

                if ((
$this->infoArray['oneColorChannelPixelBytes']==2)) {
                    
$r $r >> 8;
                    
$g $g >> 8;
                    
$b $b >> 8;
                } elseif ((
$this->infoArray['oneColorChannelPixelBytes']==4)) {
                    
$r $r >> 24;
                    
$g $g >> 24;
                    
$b $b >> 24;
                }

                
$pixelColor imagecolorallocate($image,$r,$g,$b);
                
imagesetpixel($image,$columnPointer,$rowPointer,$pixelColor);
            }
        }
        
fclose($this->fp);
        if (isset(
$this->tempFileName)) unlink($this->tempFileName);
        return 
$image;
    }

    
/**
     *
     * PRIVATE FUNCTIONS
     *
     */

    
function _getPackedBitsDecoded($string) {
        
/*
        The PackBits algorithm will precede a block of data with a one byte header n, where n is interpreted as follows:
        n Meaning
        0 to 127 Copy the next n + 1 symbols verbatim
        -127 to -1 Repeat the next symbol 1 - n times
        -128 Do nothing

        Decoding:
        Step 1. Read the block header (n).
        Step 2. If the header is an EOF exit.
        Step 3. If n is non-negative, copy the next n + 1 symbols to the output stream and go to step 1.
        Step 4. If n is negative, write 1 - n copies of the next symbol to the output stream and go to step 1.

        */

        
$stringPointer 0;
        
$returnString '';

        while (
1) {
            if (isset(
$string[$stringPointer])) $headerByteValue $this->_unsignedToSigned(hexdec(bin2hex($string[$stringPointer])),1);
            else return 
$returnString;
            
$stringPointer++;

            if (
$headerByteValue >= 0) {
                for (
$i=0$i <= $headerByteValue$i++) {
                    
$returnString .= $string[$stringPointer];
                    
$stringPointer++;
                }
            } else {
                if (
$headerByteValue != -128) {
                    
$copyByte $string[$stringPointer];
                    
$stringPointer++;

                    for (
$i=0$i < (1-$headerByteValue); $i++) {
                        
$returnString .= $copyByte;
                    }
                }
            }
        }
    }

    function 
_unsignedToSigned($int,$byteSize=1) {
        switch(
$byteSize) {
            case 
1:
                if (
$int<128) return $int;
                else return -
256+$int;
                break;

            case 
2:
                if (
$int<32768) return $int;
                else return -
65536+$int;

            case 
4:
                if (
$int<2147483648) return $int;
                else return -
4294967296+$int;

            default:
                return 
$int;
        }
    }

    function 
_hexReverse($hex) {
        
$output '';
        if (
strlen($hex)%2) return false;
        for (
$pointer strlen($hex);$pointer>=0;$pointer-=2$output .= substr($hex,$pointer,2);
        return 
$output;
    }

    function 
_getInteger($byteCount=1) {
        switch (
$byteCount) {
            case 
4:
                
// for some strange reason this is still broken...
                
return @reset(unpack('N',fread($this->fp,4)));
                break;

            case 
2:
                return @
reset(unpack('n',fread($this->fp,2)));
                break;

            default:
                return 
hexdec($this->_hexReverse(bin2hex(fread($this->fp,$byteCount))));
        }
    }
}

/**
 * Returns an image identifier representing the image obtained from the given filename, using only GD, returns an empty string on failure
 *
 * @param string $fileName
 * @return image identifier
 */

function imagecreatefrompsd($fileName) {
    
$psdReader = new PhpPsdReader($fileName);
    if (isset(
$psdReader->infoArray['error'])) return '';
    else return 
$psdReader->getImage();

  #10 (permalink)  
Antiguo 16/12/2009, 18:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnail de archivos ABR

bien podrías hacer lo mismo con el software aquel que mencionaste para leer ABR

osea, sabiendo que es OpenSource puedes descargar el código fuente y reescribirlo en PHP, tarea dura... pero supongo que vale la pena, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 16/12/2009, 18:38
 
Fecha de Ingreso: noviembre-2007
Mensajes: 229
Antigüedad: 16 años, 5 meses
Puntos: 0
Cita:
Iniciado por pateketrueke Ver Mensaje
bien podrías hacer lo mismo con el software aquel que mencionaste para leer ABR

osea, sabiendo que es OpenSource puedes descargar el código fuente y reescribirlo en PHP, tarea dura... pero supongo que vale la pena, suerte!!
tarea durisima ya que C y yo no somos muy amigos aunque creo que no queda otra...

bueno el primer paso ya esta hecho aqui he encontrado un pdf el cual describe como leer todos los archivos de photoshop desde pinceles, psd, etc estoy mirando como hcerlo pero si alguien cree que puede aportar algo será bienvenido...

http://libpsd.graphest.com/files/Pho...%20Formats.pdf

gracias

buenas

ya he empezado con el el codigo php que me saque un thumnail de las imagenes...

esto es lo que llevo de moemento...

Código PHP:
    $fp fopen("a.abr",'r');
        
$infoArray['version id'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['Number_brush'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['typeofBrush'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['NumberofBytes'] = @reset(unpack('N',fread($fp,4)));
        
$infoArray['Misce'] = @reset(unpack('N',fread($fp,4)));
        
$infoArray['Spacing'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['Diameter'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['Roudness'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['Angle'] = @reset(unpack('n',fread($fp,2)));
        
$infoArray['hardness'] = @reset(unpack('n',fread($fp,2)));
        
fclose($fp);
        
        
var_dump($infoArray); 
pero creo que estan mal, por ejemplo la array typeofbrush me tendria que devolver 1 o 2 dependiendo del tipo de pincel y me devuelve 14000 y pico...

por lo tanto me gustaria haver si alguien puede poner un granito de arena en este codigo que al fin y al cabo el dia de mañana todos lo podemos utilizar. ya que si alguien desea hacer una pagina con cosas de photoshop, y quiere subir pinceles no haria falta subir tambien una imagen con los pinceles de los que se trata...

Buenas:

ya he avanzado un poquito mas en esto...conseguí un programa en "C" que leia los archivos en abr y los transforma en formato para el GIMP.

Gracias a eso estoy haciendo el codigo para leer los pinceles abr en php...

lo que pasa me quedado bloqueado, tengo que crear estructuras en php es decir...

Código:
struct _AbrBrushHeader
{
	gshort type;
	gint32 size;
};
esto es lo que tengo hecho de momento...

Código PHP:

function abr_read_short($arsfp,$bytes,$type){ 
    if(
$arsfp != NULL){
        return @
reset(unpack($type,fread($arsfp,$bytes)));
    }
}
    
function 
abr_load_v6($alvfp,$fle){
    
$infoArray['abr_subver'] = abr_read_short($alvfp,2,"n");
}
     
$file="a.abr";
$abr fopen($file,'rb');
$infoArray['version id'] = abr_read_short($abr,2,"n");// @reset(unpack('n',fread($fp,2)));
switch ($infoArray['version id']){
            case 
1:
            case 
2:
            break;
            case 
6:
            
abr_load_v6($abr,$file);
            break;
            default:
            Echo 
"Error: El archivo $file no es un pincel válido de Photoshop";
            break;
}    

fclose($abr); 
Gracias por todo

Última edición por GatorV; 20/12/2009 a las 11:35
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:46.