compress img api

This commit is contained in:
themohooks 2024-07-13 02:47:11 +03:00
parent c80530a6fa
commit c7e5f101b5
11 changed files with 114 additions and 8 deletions

View file

@ -0,0 +1,90 @@
<?php
namespace App\Controllers\Api\Images;
class Compress {
private static function compressAndResizeImage($source_url, $quality, $max_width, $max_height) {
$info = getimagesize($source_url);
if ($info === false) {
return false;
}
$width = $info[0];
$height = $info[1];
$aspect_ratio = $width / $height;
// Вычисляем новые размеры, сохраняя соотношение сторон
if ($width > $height) {
$new_width = $max_width;
$new_height = $max_width / $aspect_ratio;
} else {
$new_height = $max_height;
$new_width = $max_height * $aspect_ratio;
}
if ($info['mime'] == 'image/jpeg') {
$image = imagecreatefromjpeg($source_url);
} elseif ($info['mime'] == 'image/gif') {
$image = imagecreatefromgif($source_url);
} elseif ($info['mime'] == 'image/png') {
$image = imagecreatefrompng($source_url);
} else {
return false;
}
$resized_image = imagecreatetruecolor($new_width, $new_height);
if ($info['mime'] == 'image/png' || $info['mime'] == 'image/gif') {
imagealphablending($resized_image, false);
imagesavealpha($resized_image, true);
$transparent = imagecolorallocatealpha($resized_image, 255, 255, 255, 127);
imagefilledrectangle($resized_image, 0, 0, $new_width, $new_height, $transparent);
}
imagecopyresampled($resized_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
ob_start();
imagejpeg($resized_image, null, $quality);
$compressed_image_data = ob_get_contents();
ob_end_clean();
imagedestroy($image);
imagedestroy($resized_image);
return $compressed_image_data;
}
private static function generateCacheFilename($source_url, $quality, $max_width, $max_height) {
return $_SERVER['DOCUMENT_ROOT'].'/cdn/imgcache/' . md5($source_url . $quality . $max_width . $max_height) . '.jpg';
}
public function __construct() {
$source_url = $_GET['url'];
$quality = 40;
$max_width = 400;
$max_height = 400;
$cache_filename = self::generateCacheFilename($source_url, $quality, $max_width, $max_height);
if (file_exists($cache_filename)) {
$compressed_image_data = file_get_contents($cache_filename);
} else {
$compressed_image_data = self::compressAndResizeImage($source_url, $quality, $max_width, $max_height);
if ($compressed_image_data) {
file_put_contents($cache_filename, $compressed_image_data);
} else {
echo "Произошла ошибка при сжатии изображения.";
exit;
}
}
if ($compressed_image_data) {
header('Content-Type: image/jpeg');
header('Content-Length: ' . strlen($compressed_image_data));
echo $compressed_image_data;
}
}
}
?>

View file

@ -32,7 +32,7 @@ class Upload
if ($_FILES['image']['error'] != 4) {
$exif = new EXIF($_FILES['image']['tmp_name']);
$exif = $exif->getData();
$upload = new UploadPhoto($_FILES['image'], 'cdn/img');
$upload = new UploadPhoto($_FILES['image'], 'cdn/img/');
if ($exif === null) {
$exif = Json::return(
array(

View file

@ -7,6 +7,7 @@ use \App\Core\Page;
use \App\Controllers\Api\{Login, Register};
use \App\Controllers\Api\Images\{Upload};
use \App\Controllers\Api\Images\Rate as PhotoVote;
use \App\Controllers\Api\Images\Compress as PhotoCompress;
use \App\Controllers\Api\Images\Comments\Create as PhotoComment;
use \App\Controllers\Api\Images\Comments\Load as PhotoCommentLoad;
use \App\Controllers\Api\Images\Comments\Rate as PhotoCommentVote;
@ -39,6 +40,9 @@ class ApiController
public static function updateprofile() {
return new ProfileUpdate();
}
public static function photocompress() {
return new PhotoCompress();
}
}

View file

@ -35,6 +35,7 @@ class Routes
Router::post('/api/upload', 'ApiController@upload');
Router::post('/api/profile/update', 'ApiController@updateprofile');
Router::post('/api/photo/comment', 'ApiController@photocomment');
Router::get('/api/photo/compress', 'ApiController@photocompress');
Router::post('/api/photo/getcomments/$id', 'ApiController@photocommentload');
Router::get('/api/photo/vote', 'ApiController@photovote');
Router::get('/api/photo/comment/rate', 'ApiController@photocommentvote');

View file

@ -40,7 +40,7 @@ class Upload
$s3->putObject([
'Bucket' => NGALLERY['root']['storage']['s3']['credentials']['bucket'],
'Key' => 'cdn/img/'.$filecdn,
'Key' => $location.$filecdn,
'SourceFile' => $file['tmp_name']
]);
$this->type = explode('/', $file['type'])[0];

BIN
static/PEPPERSCREEN.ttf Normal file

Binary file not shown.

BIN
static/img/248.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
static/img/sttslogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View file

@ -41,6 +41,17 @@ use \App\Models\User;
?>
</ul>
</div>
<div class="p20">
<h4><img src="/static/img/248.ico">Фотомодераторы</h4>
<ul style="list-style: none; margin: 0; padding: 0;">
<?php
$admins = DB::query('SELECT * FROM users WHERE admin=2');
foreach ($admins as $a) {
echo '<li><b><a href="/author/'.$a['id'].'/"><img onerror="this.src = `/static/img/avatar.png`; this.onerror = null;" src="'.$a['photourl'].'" width="32" style="border-radius: 3px; margin-right: 5px;">'.htmlspecialchars($a['username']).'</a></b></li>';
}
?>
</ul>
</div>
</table>
</td>

View file

@ -75,7 +75,7 @@ foreach ($photos as $pd) {
foreach ($photo as $p) {
$author = new User($p['user_id']);
echo '<a href="/photo/'.$p['id'].'" target="_blank" class="prw pop-prw">
<img width="250" src="'.$p['photourl'].'">
<img width="250" src="/api/photo/compress?url='.$p['photourl'].'">
<div class="hpshade">
<div class="eye-icon">+'.$pd['view_count'].'</div>
</div>
@ -100,13 +100,13 @@ foreach ($photos as $pd) {
<?php
$photos = DB::query('SELECT * FROM photos ORDER BY RAND() DESC LIMIT 7');
foreach ($photos as $p) {
$bck = 'background-image:url("' . $p['photourl'] . '")';
$bck = 'background-image:url("/api/photo/compress?url=' . $p['photourl'] . '")';
echo ' <div class="prw-grid-item">
<div class="prw-wrapper"><span style="word-spacing:-1px"><b>' . htmlspecialchars($p['place']) . '</b></span>
<div>' . Date::zmdate($p['posted_at']) . '</div>
</div>
'; ?>
<a href="/photo/<?= $p['id'] ?>" target="_blank" class="prw-animate" style='background-image:url("<?= $p['photourl'] ?>")'></a>
<a href="/photo/<?= $p['id'] ?>" target="_blank" class="prw-animate" style='background-image:url("/api/photo/compress?url=<?= $p['photourl'] ?>")'></a>
<?php echo '
</div>';
}
@ -123,13 +123,13 @@ foreach ($photos as $pd) {
<?php
$photos = DB::query('SELECT * FROM photos ORDER BY id DESC LIMIT 30');
foreach ($photos as $p) {
$bck = 'background-image:url("' . $p['photourl'] . '")';
$bck = 'background-image:url("/api/photo/compress?url=' . $p['photourl'] . '")';
echo ' <div class="prw-grid-item">
<div class="prw-wrapper"><span style="word-spacing:-1px"><b>' . htmlspecialchars($p['place']) . '</b></span>
<div>' . Date::zmdate($p['posted_at']) . '</div>
</div>
'; ?>
<a href="/photo/<?= $p['id'] ?>" target="_blank" class="prw-animate" style='background-image:url("<?= $p['photourl'] ?>")'></a>
<a href="/photo/<?= $p['id'] ?>" target="_blank" class="prw-animate" style='background-image:url("/api/photo/compress?url=<?= $p['photourl'] ?>")'></a>
</div>
<?php }
?>

View file

@ -128,7 +128,7 @@ if ($photo->i('id') !== null) {
<tr>
<?php
if ($photo->i('place') != null) { ?>
<td class="nw" valign="top" align="right"><b><?= $photo->i('place') ?></b></td>
<td class="nw" valign="top" align="right"><b><?= $photo->i('postbody') ?></b></td>
<?php } ?>
<td class="nw" align="left" valign="top"></td>
</tr>