Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Совсем не разберусь как так

09.02.2020, 03:41. Показов 614. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
$transfY = $transfX = 0;
if(($w_src * $h_new / $h_src) < $w_new) { // Делаем так, чтобы небыло пустот на выходе по заданным размерам, при сжатии. Либо обрежем лишнее по X, либо по Y.
    $h_new = $h_src * $w_new / $w_src;
                
} else {
                    
    $w_new = $w_src * $h_new / $h_src;
    //$transfX = ; //Указываем сдвиг по X, если режим изображение по X
                
}
imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $w_src, $h_src);
Работает, изображение сжимается таким образом. ЧТобы на выходе получилось изображение без пустот. Сам толком не разберу как это работает, трудность в том. ЧТо необходимо выровнять по центру.

Допустим на выходе обрезали лишнее по оси X. На выходе получили ширину 200, обрезали еще столько же с правого края. Необходимо сдвинуть, чтобы на выходе получить изображение которое обрезали и с правого и с левого края по 100px

Добавлено через 9 минут
PHP
1
2
3
4
5
6
7
8
9
10
$transfY = $transfX = 0;
if(($w_src * $h_new / $h_src) < $w_new) { // Делаем так, чтобы небыло пустот на выходе по заданным размерам, при сжатии. Либо обрежем лишнее по X, либо по Y.   
    $h_tm = $h_src * $w_new / $w_src;
    $transfY = $h_tm-$h_new/2; //Сдвиг, на центр по Y
    $h_new = $h_tm;
} else {        
    $w_tm = $w_src * $h_new / $h_src;
    $transfX = $w_tm-$w_new/2; //Сдвиг, на центр по X
    $w_new = $w_tm;
}
Вроде все верно, выравнивает по центру. Блин, быть может что та лучше есть, запутаца можно...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2020, 03:41
Ответы с готовыми решениями:

Подскажите пожалуйста, не как не разберусь
Доброй ночи, подскажите пожалуйста и помогите разобраться как сделать правильно. Работаю с сетевым графиком. Есть форма с множеством...

Программа работает не совсем так, как нужно
import java.io.*; public class Pr2{ public static void main(String args) throws FileNotFoundException,...

Сайт на пк выглядит нормально, а вот на телефонах совсем не так. Как пофиксить?
Как пофиксить дизайн на телефоне?

8
79 / 48 / 22
Регистрация: 30.06.2016
Сообщений: 187
09.02.2020, 03:42
пожалуйста приведите полный код, включая изображение над которым проводятся манипуляции, чтобы участники дискуссии могли запустить его на своих интерпретаторах без лишних танцов с бубнами. из данного сообщения совсем не понятна проблема и контекст
0
Заблокирован
09.02.2020, 05:01  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
class SimpleImage {
 
    var $image;
    var $image_type;
    
    function load($filename) {
            
        $image_info = getimagesize($filename);
 
        $this->image_type = $image_info[2];
        if($this->image_type == IMAGETYPE_JPEG)
            $this->image = imagecreatefromjpeg($filename);
        elseif($this->image_type == IMAGETYPE_GIF)
            $this->image = imagecreatefromgif($filename);
        elseif($this->image_type == IMAGETYPE_PNG)
            $this->image = imagecreatefrompng($filename);
        
    }
   
    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
        
        if($this->eror) return false;
        
        if($image_type == IMAGETYPE_JPEG)
            imagejpeg($this->image,$filename,$compression);
        elseif($image_type == IMAGETYPE_GIF)
            imagegif($this->image,$filename);
        elseif($image_type == IMAGETYPE_PNG)
            imagepng($this->image,$filename);
      
        if($permissions != null)
            chmod($filename,$permissions);
      
    }
   
    function output($image_type = IMAGETYPE_JPEG) {
       
        if($image_type == IMAGETYPE_JPEG)
            imagejpeg($this->image);
        elseif( $image_type == IMAGETYPE_GIF)
            imagegif($this->image);
        elseif( $image_type == IMAGETYPE_PNG)
            imagepng($this->image);    
      
    }
    
    function getWidth() {
        return imagesx($this->image);
    } 
    
    function getHeight() {
        return imagesy($this->image);
    }
    
    function resizeToHeight($height) {
        $ratio = $height / $this->getHeight();
        $width = $this->getWidth() * $ratio;
        $this->resize($width,$height);
    }
    
    function resizeToWidth($width) {
        $ratio = $width / $this->getWidth();
        $height = $this->getheight() * $ratio;
        $this->resize($width,$height);
    }
    
    function scale($scale) {
        $width = $this->getWidth() * $scale/100;
        $height = $this->getheight() * $scale/100;
        $this->resize($width,$height);
    }
    
    function resize($w_new, $h_new) {
        
        $w_src = $this->getWidth();
        $h_src = $this->getHeight();
        
        $new_image   = imagecreatetruecolor($w_new, $h_new);
        
        //Сжимаем изображение по одной из минимальных сторон, далее лишнее обрежем
        $transfY = $transfX = 0;
        if(($w_src * $h_new / $h_src) < $w_new) { // Делаем так, чтобы небыло пустот на выходе по заданным размерам, при сжатии. Либо обрежем лишнее по X, либо по Y.   
            $h_tm    = $h_src * $w_new / $w_src;
            $transfY = $h_tm-$h_new/2; //Сдвиг, на центр по Y
            $h_new   = $h_tm;
        } else {        
            $w_tm    = $w_src * $h_new / $h_src;
            $transfX = $w_tm-$w_new/2; //Сдвиг, на центр по X
            $w_new   = $w_tm;
        }
        
        imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $w_src, $h_src);
        $this->image = $new_image;
    }
    
}
 
$image = new SimpleImage();
$image->load('https://c7.hotpng.com/preview/748/829/80/flower-bouquet-rose-yellow-plum.jpg'); //URL на изображение
$image->resize(445, 260);
$image->save(UPLOADS."-1.jpeg"); //Сохраняем изображение
Что та не так сделал, на одном изображении работала. На другом криво все

Добавлено через 4 минуты
Ничего не понимаю, так работает. Подгружаю через якс, все криво.

Добавлено через 45 минут
К примеру если сделать изначальное изображение 700 на 700
А в исходнике указать $image->resize(445, 260);.

Поразмыслив, верно все работает, но косяк. На выходе не получим изображение которое полностью закроет лост, или, блин.

Если указать прям огромную разницу в соотношениях строн изначального изображения все работает. Но вот выше описанном, что та не так идет. Изображение сжимаеца, но на выходе по отношению старон неравны. То есть необходимо в таких случаях...

Блин, хелп...
0
Заблокирован
09.02.2020, 05:06  [ТС]
Прикрепил избражение.
Параметр
PHP
1
$image->resize(445, 260);
По ширине от края до края сжала. А вот высоту подрезало, сдвиг есть ближе к центру. Но что все равно высоковато взяло

При следующих параметрах
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
        //Сжимаем изображение по одной из минимальных сторон, далее лишнее обрежем
        $transfY = $transfX = 0;
        if(($w_src * $h_new / $h_src) < $w_new) { //Если ширина от края до края, тогда режем высоту и на центр 
            $h_tm    = $h_src * $w_new / $w_src;
            $transfY = $h_tm/2-$h_new/2; //Сдвиг, на центр по Y
            $h_new   = $h_tm;
        } else {     //Если высота от края до края, режим ширину и на центр.
            $w_tm    = $w_src * $h_new / $h_src;
            $transfX = $w_tm/2-$w_new/2; //Сдвиг, на центр по X
            $w_new   = $w_tm;
        }
        
        imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $w_src, $h_src);
Миниатюры
Совсем не разберусь как так   Совсем не разберусь как так  
0
79 / 48 / 22
Регистрация: 30.06.2016
Сообщений: 187
09.02.2020, 07:21
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    function resize($w_new, $h_new) {
        
        $w_src = $this->getWidth();
        $h_src = $this->getHeight();
        
        
        //Сжимаем изображение по одной из минимальных сторон, далее лишнее обрежем
        /*
        $transfY = $transfX = 0;
        if(($w_src * $h_new / $h_src) < $w_new) { // Делаем так, чтобы небыло пустот на выходе по заданным размерам, при сжатии. Либо обрежем лишнее по X, либо по Y.   
            $h_tm    = $h_src * $w_new / $w_src;
            $transfY = $h_tm-$h_new/2; //Сдвиг, на центр по Y
            $h_new   = $h_tm;
        } else {        
            $w_tm    = $w_src * $h_new / $h_src;
            $transfX = $w_tm-$w_new/2; //Сдвиг, на центр по X
            $w_new   = $w_tm;
        }
        */
 
 
        $ratio = max($w_new/$w_src, $h_new/$h_src);
        $h = $h_new / $ratio;
        $x = ($w_src - $w_new / $ratio) / 2;
        $w = $w_new / $ratio;
        
        $new_image   = imagecreatetruecolor($w_new, $h_new);
        imagecopyresampled($new_image, $this->image, 0, 0, $x, 0, $w_new, $h_new, $w, $h);
        
        //imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $w_src, $h_src);
        $this->image = $new_image;
    }
если я правильно понял, вы пишете ресайз изображений(можно изучить кучу готового кода на гитхабе)

Добавлено через 1 час 2 минуты
И если вы меняете пропорции - вот вариант с кропом из центра+ресайз
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    
    function resize($w_new, $h_new) {
        
        $w_src = $this->getWidth();
        $h_src = $this->getHeight();
        
        $current_ratio = $w_src / $h_src;
        $new_ratio = $w_new / $h_new;
 
        if ($w_new > $h_new) {
 
            $new_max_height = $w_src / $new_ratio;
            $new_max_width = $new_max_height * $new_ratio;
        } else {
            $new_max_width = $h_src * $new_ratio;
            $new_max_height = $new_max_width / $new_ratio;
        }
 
 
        $cropx = ($w_src - $new_max_width)/2;
        $cropy = ($h_src - $new_max_height)/2;
 
 
        $im2 = imagecrop($this->image, ['x' => $cropx, 'y' => $cropy, 'width' => $new_max_width, 'height' => $new_max_height]);
        
 
        $ratio = max($w_new/$new_max_width, $h_new/$new_max_height);
        $h = $h_new / $ratio;
        $x = ($new_max_width - $w_new / $ratio) / 2;
        $w = $w_new / $ratio;
        
        $new_image   = imagecreatetruecolor($w_new, $h_new);
        imagecopyresampled($new_image, $im2, 0, 0, $x, 0, $w_new, $h_new, $w, $h);
        
        //imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $w_src, $h_src);
        $this->image = $new_image;
    }
PHP
1
2
3
4
5
6
$image = new SimpleImage();
$image->load('https://c7.hotpng.com/preview/748/829/80/flower-bouquet-rose-yellow-plum.jpg'); //URL на изображение
    //$image->resize(100, 200);
    //$image->resize(200, 60);
// etc
$image->save("/var/www/html/public/test/1.jpeg"); //Сохраняем изображение
0
Заблокирован
09.02.2020, 15:12  [ТС]
Fatal error: Call to undefined function imagecrop() in /var/www/u/classes/SimpleImage.php on line 199

Что та функцию у меня не находит.
0
79 / 48 / 22
Регистрация: 30.06.2016
Сообщений: 187
10.02.2020, 02:19
PHP
1
https://www.php.net/manual/ru/function.imagecrop.php
наверно пхп нужно обновить
1
Заблокирован
10.02.2020, 03:30  [ТС]
Совсем не так работает...

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    function resize($w_new, $h_new) {
        
        $new_image   = imagecreatetruecolor($w_new, $h_new);
        
        //Сжимаем изображение по одной из минимальных сторон, далее лишнее обрежем
        $transfY = $transfX = 0;
        if(($this->width * $h_new / $this->height) < $w_new) { // Делаем так, чтобы небыло пустот на выходе по заданным размерам, при сжатии. Либо обрежем лишнее по X, либо по Y.   
            $h_tm    = $this->height * $w_new / $this->width;
            $transfY = $h_tm/2-$h_new/2; //Сдвиг, на центр по Y
            $h_new   = $h_tm;
        } else {        
            $w_tm    = $this->width * $h_new / $this->height;
            $transfX = $w_tm/2-$w_new/2; //Сдвиг, на центр по X
            $w_new   = $w_tm;
        }
        
        imagecopyresampled($new_image, $this->image, 0, 0, $transfX, $transfY, $w_new, $h_new, $this->width, $this->height);
        $this->image = $new_image;
    }
Мой вариант лучше, высота изображения наименьшая из сторон. Чтобы не было пустот, делает изображение по заданной высоте, а лишнее по горизонтали обрезает...

Сейчас трудность в том, что если задать размеры скажем 100 на 150. А размеры исходника 100 на 100. То на выходе получаться те же пустоты. то есть 50 пикселей будет темная строчка на изображении.

Как сделать так, что если получается такое. То изображение сжать таким образом, чтобы оно заняло весь холст, личнее обрезать и выровнять по центру. В этом сейчас косяк...
Миниатюры
Совсем не разберусь как так  
0
79 / 48 / 22
Регистрация: 30.06.2016
Сообщений: 187
10.02.2020, 04:45
второй вариант с кропом из центра+ресайз не подходит?
исходник 200x200 рейсайз в 200x350
Миниатюры
Совсем не разберусь как так  
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2020, 04:45
Помогаю со студенческими работами здесь

Массу Ньютон определял совсем не так как ее определяют в современной, якобы, Ньютоновской механике
К сожалению, СМИ и учебники чаще всего нам перевирают Ньютона, искажают его, мистифицируют. В частности, массу Ньютон определял совсем...

Работа со строками. Програма работает, но не совсем так.
помогите пожалуйста мне задали увеличить строку символов за счет вставки между словами пропусков я сделал программу но пропусков она не...

Что я делаю не так. Совсем нубский вoпрос.
Везде в руководствах говорится, что обработчик нажатия кнопки должен переопределять метод onClick. У меня данный код не компилируется. Если...

Не совсем ошибка, просто я не знаю почему так выходит
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Не работает jquery, не отображает совсем ничего. Что не так?
не работает jquery &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;&lt;/title&gt; &lt;link...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru