Bienvenidos al foro de Hive Mind

Aquí se intentarán resolver dudas sobre informática y compartir conocimientos sobre edición de vídeos, web y diseño
#1419
Como apertura de esta sección de temas, he decidido poner el código utilizado para redimensionar los avatares en este tipo de foro, phpbb3.
De una forma más detallada podría decir, que la siguiente modificación permite a los usuarios subir un avatar del ancho y alto que ellos quieran y este, automáticamente, será autoredimensionado. Por alguna extraña razón, los desarrolladores de phpBB nunca añadieron esta función, lo cuál es sorprendente, ya que escribieron la mayor parte del código.

Bueno, adelante con el procedimiento. Primero, abrir el archivo: includes/functions_posting.php y localizar create_thumbnail. La función empieza con este código:
Código: Seleccionar todo
/**
* Create Thumbnail
*/
function create_thumbnail($source, $destination, $mimetype)
{
y termina con este otro código
Código: Seleccionar todo
	if (!file_exists($destination))
	{
		return false;
	}

	phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);

	return true;
}
Remplazar la función entera con el siguiente código:
Código: Seleccionar todo
/**
* Create Thumbnail
*/

function create_thumbnail($source, $destination, $mimetype, $new_width=0, $new_height=0) {
	global $config;

	if ($new_width == 0) {
		$min_filesize = (int) $config['img_min_thumb_filesize'];
		$img_filesize = (file_exists($source)) ? @filesize($source) : false;
		if (!$img_filesize || $img_filesize <= $min_filesize) {
			return false;
		}
	}
	else {
		$destination = $source;
	}

	$dimension = @getimagesize($source);
	if ($dimension === false) {
		return false;
	}

	list($width, $height, $type, ) = $dimension;
	if (empty($width) || empty($height)) {
		return false;
	}

	if ($new_width == 0) {
		list($new_width, $new_height) = get_img_size_format($width, $height);
	}
	else if ($height > $new_height || $width > $new_width) {
		$h_ratio = $new_height / $height;
		$w_ratio = $new_width / $width;
		$scale_factor = ($h_ratio < $w_ratio) ? $h_ratio : $w_ratio;
		$new_width = ($h_ratio < $w_ratio) ? round($width * $scale_factor) : $new_width;
		$new_height = ($w_ratio < $h_ratio) ? round($height * $scale_factor) : $new_height;
	}
	else {
		return false;
	}

	// Do not create a thumbnail if the resulting width/height is bigger than the original one
	if ($new_width >= $width && $new_height >= $height) {
		return false;
	}

	$used_imagick = false;

	// Only use imagemagick if defined and the passthru function not disabled
	if ($config['img_imagick'] && function_exists('passthru')) {
		if (substr($config['img_imagick'], -1) !== '/') {
			$config['img_imagick'] .= '/';
		}

		@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -geometry ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" "' . str_replace('\\', '/', $destination) . '"');

		if (file_exists($destination)) {
			$used_imagick = true;
		}
	}

	if (!$used_imagick) {
		$type = get_supported_image_types($type);
		if ($type['gd']) {
			// If the type is not supported, we are not able to create a thumbnail
			if ($type['format'] === false) {
				return false;
			}

			switch ($type['format']) {
				case IMG_GIF:
					$image = @imagecreatefromgif($source);
				break;

				case IMG_JPG:
					@ini_set('gd.jpeg_ignore_warning', 1);
					$image = @imagecreatefromjpeg($source);
				break;

				case IMG_PNG:
					$image = @imagecreatefrompng($source);
				break;

				case IMG_WBMP:
					$image = @imagecreatefromwbmp($source);
				break;
			}

			if (empty($image)) {
				return false;
			}

			if ($type['version'] == 1) {
				$new_image = imagecreate($new_width, $new_height);

				if ($new_image === false) {
					return false;
				}

				imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
			}
			else {
				$new_image = imagecreatetruecolor($new_width, $new_height);
				if ($new_image === false) {
					return false;
				}

				// Preserve alpha transparency (png for example)
				@imagealphablending($new_image, false);
				@imagesavealpha($new_image, true);
				imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
			}

			// If we are in safe mode create the destination file prior to using the gd functions to circumvent a PHP bug
			if (@ini_get('safe_mode') || @strtolower(ini_get('safe_mode')) == 'on') {
				@touch($destination);
			}

			switch ($type['format']) {
				case IMG_GIF:
					imagegif($new_image, $destination);
				break;

				case IMG_JPG:
					imagejpeg($new_image, $destination, 90);
				break;

				case IMG_PNG:
					imagepng($new_image, $destination);
				break;

				case IMG_WBMP:
					imagewbmp($new_image, $destination);
				break;
			}

			imagedestroy($new_image);
		}
		else {
			return false;
		}
	}

	if (!file_exists($destination)) {
		return false;
	}
	phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);
	return array($new_width, $new_height);
}
Guarda el archivo. Ahora abre includes/functions_user.php y encuentra el siguiente código:
Código: Seleccionar todo
	$prefix = $config['avatar_salt'] . '_';
	$file->clean_filename('avatar', $prefix, $data['user_id']);
Remplaza el código con esto:
Código: Seleccionar todo
	$prefix = $config['avatar_salt'] . '_';
	
//	MODIFICATION BY INDIFERENTEJACK
	// resize uploaded avatar
	include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
	@ini_set('memory_limit','128M');
	$result = create_thumbnail($file->get('filename'), '', '', $config['avatar_max_width'], $config['avatar_max_height']);
	if ($result) {
		list($file->width, $file->height) = $result;
	}
//	END MODIFICATION

	$file->clean_filename('avatar', $prefix, $data['user_id']);
¡Y esto es todo! Cabe recalcar que lo ideal sería hacerlo con notepad++ (por supuesto) y hacer una copia de seguridad de estos dos archivos.

Por otra parte, redimensionar las imágenes es un proceso intensivo, normalmente por eso suele estar limitado. Si la gente tiene problemas a la hora de cambiar el avatar con pantallas en blanco puede ser por el tamaño de los archivos, habrá que ir al panel ACP y en general>avatar puedes cambiar el tamaño a 262144 bytes. Esto es todo, cualquier duda ya sabéis, preguntad :)
0
Avatar de Usuario
Por FrostRaimier
#1420
Muy buen aporte tra()
0