validar - subir, mostrar, modificar y eliminar una imagen en mysql desde php
Encuentra resolución JPEG con PHP (5)
Dependiendo de cómo se haya guardado la imagen, EXIF contiene una gran cantidad de información: lea más sobre esto en el manual de PHP . Sin embargo, es posible que necesite analizar / procesar los resultados un poco (por ejemplo, la información del flash es, o al menos ha sido, solo un byte, que expresa varios estados).
¡Llamando a todos los gurús de PHP!
Entiendo que puede usar getimagesize () para obtener la altura y el ancho reales de una imagen en PHP. Sin embargo, si abre una imagen en photoshop y mira el cuadro de diálogo de tamaño de imagen, observa que hay un valor de resolución que determina el tamaño de impresión de la imagen.
Dado un archivo de imagen jpg arbitrario, necesito usar PHP para determinar este número de resolución. Parece que esta información se almacena en el archivo jpg en algún lugar, entonces, ¿cómo puedo llegar a ella?
Otro requisito: solo tengo gdlib disponible para mí. Necesito hacer esto sin el uso de otras bibliotecas de php (imagemagick, etc.)
¡Gracias por la ayuda!
Hay dos lugares en los que se puede almacenar una resolución (es decir, la resolución del JPEG cuando se imprime, también denominado taquigrafía como DPI o puntos por pulgada).
El primero está en el encabezado JFIF de JPEG, que a menudo (pero NO siempre) está justo al comienzo del JPEG.
El otro está en los datos EXIF.
Tenga en cuenta que los datos de resolución generalmente NO están presentes, ya que solo tienen significado si están asociados con un tamaño de salida física. Por ejemplo, si una cámara digital escribe el valor, generalmente no tiene sentido. Sin embargo, cuando el JPEG se está enviando a una impresora (por ejemplo), entonces el valor tendrá un significado.
Aquí hay un código para obtenerlo del encabezado JFIF, siempre que haya uno presente, y esté dentro de un fragmento APP0, que es el segundo fragmento del archivo. (El primer fragmento siempre es el marcador SOI):
function read_JFIF_dpi($filename)
{
$dpi = 0;
$fp = @fopen($filename, r);
if ($fp) {
if (fseek($fp, 6) == 0) { // JFIF often (but not always) starts at offset 6.
if (($bytes = fread($fp, 16)) !== false) { // JFIF header is 16 bytes.
if (substr($bytes, 0, 4) == "JFIF") { // Make sure it is JFIF header.
$JFIF_density_unit = ord($bytes[7]);
$JFIF_X_density = ord($bytes[8])*256 + ord($bytes[9]); // Read big-endian unsigned short int.
$JFIF_Y_density = ord($bytes[10])*256 + ord($bytes[11]); // Read big-endian unsigned short int.
if ($JFIF_X_density == $JFIF_Y_density) { // Assuming we''re only interested in JPEGs with square pixels.
if ($JFIF_density_unit == 1) $dpi = $JFIF_X_density; // Inches.
else if ($JFIF_density_unit == 2) $dpi = $JFIF_X_density * 2.54; // Centimeters.
}
}
}
}
fclose($fp);
}
return ($dpi);
}
No entiendo esto. Pixeles = tamaño de impresión x resolución, y el número de píxeles es un valor establecido. Entonces, si tiene una imagen de 300x300 píxeles, tiene 1 "x1" de resolución de 300 DPI, 2 "x2" de resolución de 150 DPI o 4 "x4" de resolución de 75 DPI, etc. Una imagen no tiene una resolución a menos que tenga un tamaño físico para compararlo con su tamaño de píxel.
¿Qué es lo que me estoy perdiendo? (¿Y qué tan evidente es para todos los demás? =])
Puede leer el archivo JPEG directamente, los bytes 14-18 especifican:
- byte 14: 01, especificador de unidad de densidad X e Y (00: ninguno, proporciones de píxeles, 01: PPP, 02: DPC)
- bytes 15-16: densidad de píxeles horizontal,
- byte 16-18: densidad de píxeles vertical
También vea: http://www.obrador.com/essentialjpeg/headerinfo.htm
SOLUCIÓN: el usuario, el conjunto de herramientas de metadatos PHP JPEG, descargado desde aquí: http://www.ozhiker.com/electronics/pjmt/
Este kit de herramientas tiene algunos scripts útiles que harán todo tipo de cosas, incluyendo la visualización y edición del encabezado, los metadatos y la información jfif en el archivo jpeg. Aquí hay un script que le proporciona la XDensity y la YDensity (la resolución de impresión xey) de un jpg:
<?php
include_once("./JPEG.php");
include_once("./JFIF.php");
$image_header = get_jpeg_header_data("./myImage.jpg");
$image_info = get_JFIF($image_header);
print( "XDensity:" . $image_info[''XDensity''] . "<br />");
print( "YDensity:" . $image_info[''YDensity''] . "<br />");
?>