Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 27
1

Изменить размер передаваемого фото

12.12.2012, 10:24. Просмотров 1925. Ответов 7
Метки нет (Все метки)


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
<?
    $api_key = "MY API KEY";
    $result = 0;
    if( is_uploaded_file( $_FILES['myfile']['tmp_name'] ) ) {
        $enabled = array(1, 2, 3);
        $imageinfo = getimagesize( $_FILES['myfile']['tmp_name'] );
        
        if( in_array( $imageinfo[2], $enabled ) ) {
            $ext = image_type_to_extension( $imageinfo[2] );
            $randval = time();
            $newname = "$randval$ext";
 
            if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $newname))
 
    list($width, $height, $file_type) = getimagesize($newname);
 
                if( ($width>1024 || $height>768) && ($file_type == 2 || $file_type == 3) ) {
                     echo '<script type="text/javascript">alert("фото только с размером 1024PX");</script>';
                     unlink($newname);
                }
 
    $handle = fopen($newname, "r");
    $data = fread($handle, filesize($newname));
 
    $pvars   = array('image' => base64_encode($data), 'key' => $api_key);
    $timeout = 60;
    $curl    = curl_init();
    $post    = http_build_query($pvars);
 
    curl_setopt($curl, CURLOPT_URL, 'http://api.**********/1/upload.xml');
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded"));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $xml_raw = curl_exec($curl);
    curl_close ($curl);
    unlink($newname);
 
    $xml = new SimpleXMLElement($xml_raw);
 
    if ($xml->error_code != '') {
        $imgur_error_code = $xml->error_code;
        $imgur_error_msg = $xml->error_msg;
 
        settype($imgur_error_code, "string");
        settype($imgur_error_msg, "string");
 
    }
        else {
            imagedestroy($image);
            $imgur_original = $xml->original_image;
 
            settype($imgur_original, "string");
            $result = 1;        
        }
    }
        else { 
        }
    }
sleep(1);
?>
 
<script language="javascript" type="text/javascript">window.top.window.stopUpload(<?=$result; ?>,'<?=$imgur_original;?>');</script>
с помощью этого скрипта на IMGUR отправляю картинку и получаю ссылку на эту картинку. переделал его из плагина для WP
но проблема в том что если картинка превышает размеров 1024/768 нужно отправить картинку 1024/768. если не превышает тогда отправить в оригинале.
могу получить с IMGUR thumbnail
PHP
1
2
$imgur_large_tbn = $xml->large_thumbnail;
settype($imgur_large_tbn, "string");
но:
1) получаю *.JPG, без разницы отправляю jpg, gif или png. это конечно проблема для анимированный *.gif
2) получаю не 1024/768
нужно записать в этом скрипт функцию такое чтоб если картинка.jpg/png превышает размеров 1024/768, уменьшить до 1024/768 и только после этого отправить. если не превышает тогда отправить в оригинале. анимированный *.gif очень редко с размером свыше 1024/768, Так что можно его оставить нетронутым.
в google нашел несколько такое php но интегрировать не смог

P.S. извиняюсь за мой русский!

Добавлено через 16 часов 26 минут
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
<?
    $api_key = "MY API KEY";
    $result = 0;
    if( is_uploaded_file( $_FILES['myfile']['tmp_name'] ) ) {
        $enabled = array(1, 2, 3);
        $imageinfo = getimagesize( $_FILES['myfile']['tmp_name'] );
 
    list($width, $height, $file_type) = getimagesize( $_FILES['myfile']['tmp_name'] );
 
                if( ($width>1024 || $height>768) {
                     echo '<script type="text/javascript">alert("ასატვირთი სურათის ზომები არ უნდა აღემატებოდეს 1024px-ს!");</script>';
                     unlink( $_FILES['myfile']['tmp_name'] );
                }
 
        if( in_array( $imageinfo[2], $enabled ) ) {
            $ext = image_type_to_extension( $imageinfo[2] );
            $randval = time();
            $newname = "$randval$ext";
 
            if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $newname))
 
    $handle = fopen($newname, "r");
    $data = fread($handle, filesize($newname));
 
    $pvars   = array('image' => base64_encode($data), 'key' => $api_key);
    $timeout = 60;
    $curl    = curl_init();
    $post    = http_build_query($pvars);
 
    curl_setopt($curl, CURLOPT_URL, 'http://api.**********/1/upload.xml');
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded"));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $xml_raw = curl_exec($curl);
    curl_close ($curl);
    unlink($newname);
 
    $xml = new SimpleXMLElement($xml_raw);
 
    if ($xml->error_code != '') {
        $imgur_error_code = $xml->error_code;
        $imgur_error_msg = $xml->error_msg;
 
        settype($imgur_error_code, "string");
        settype($imgur_error_msg, "string");
 
    }
        else {
            imagedestroy($image);
            $imgur_original = $xml->original_image;
 
            settype($imgur_original, "string");
            $result = 1;        
        }
    }
        else { 
        }
    }
sleep(1);
?>
 
<script language="javascript" type="text/javascript">window.top.window.stopUpload(<?=$result; ?>,'<?=$imgur_original;?>');</script>
в первом посте неверно было вставлен код:
PHP
1
2
3
4
                if( ($width>1024 || $height>768) {
                     echo '<script type="text/javascript">alert("фото только с размером 1024PX");</script>';
                     unlink($newname);
                }
надо было вставить этот код до переноса изображение в папке, откуда берет код IMGUR изображение для аплоада на свой сервер.

это хорошо (если я все правильно сделал), но изменить размеры пропорционально все равно не мог сделать, до аплоада

Добавлено через 35 минут
-----------------------------

вот отличный (на мой взгляд) ресайзер http://samples.geekality.net/image-resize/
прошу вас помогите интегрировать в моем скрипте

Добавлено через 23 часа 57 минут
/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-/.-
по моему все получилось с помощью http://www.cyberforum.ru/php-b... 06976.html
@KOPOJI спасибо за скрипт image_resize.php
@Lyodik за помощь [Просьба] Выдача ссылки после загрузки файла на сервер

uploader.php
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
<?
    $api_key = "MY APPI KEI";
    $result = 0;
    if( is_uploaded_file( $_FILES['myfile']['tmp_name'] ) ) {
        $enabled = array(1, 2, 3);
        $imageinfo = getimagesize( $_FILES['myfile']['tmp_name'] );
 
    list($width, $height) = getimagesize( $_FILES['myfile']['tmp_name'] );
 
        if( in_array( $imageinfo[2], $enabled ) ) {
            $ext = image_type_to_extension( $imageinfo[2] );
            $randval = time();
            $newname = "$randval$ext";
 
            if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $newname))
            
                            if($width>1024 || $height>1024) {
                                  require './image_resize.php';
                                  echo (image_resize($newname, $newname, 1024, 768));
                }
 
    $handle = fopen($newname, "r");
    $data = fread($handle, filesize($newname));
 
    $pvars   = array('image' => base64_encode($data), 'key' => $api_key);
    $timeout = 60;
    $curl    = curl_init();
    $post    = http_build_query($pvars);
 
    curl_setopt($curl, CURLOPT_URL, 'http://api.**********/1/upload.xml');
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded"));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $xml_raw = curl_exec($curl);
    curl_close ($curl);
    unlink($newname);
 
    $xml = new SimpleXMLElement($xml_raw);
 
    if ($xml->error_code != '') {
        $imgur_error_code = $xml->error_code;
        $imgur_error_msg = $xml->error_msg;
 
        settype($imgur_error_code, "string");
        settype($imgur_error_msg, "string");
 
    }
        else {
            imagedestroy($newname);
            $imgur_original = $xml->original_image;
 
            settype($imgur_original, "string");
            $result = 1;        
        }
    }
        else { 
        }
    }
sleep(1);
?>
 
<script language="javascript" type="text/javascript">window.top.window.stopUpload(<?=$result; ?>,'<?=$imgur_original;?>');</script>
image_resize.php
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
<?php ini_set('memory_limit','500M'); //для больших фотографий
function image_resize($src, $dst, $width, $height, $crop=0){
 
    if(!($pic = @getimagesize($src)))
        return false;
 
    $w = $pic[0];
    $h = $pic[1];
    $type = substr($pic['mime'], 6);
 
    $func = 'imagecreatefrom' . $type;
 
    if(!function_exists($func))
        return false;
 
    $img = $func($src);
  
    //изменение размера
    if($crop){
 
            if($w < $width || $h < $height)
                return false; //еще меньше
 
            $ratio = max($width/$w, $height/$h);
            $h = $height / $ratio;
            $x = ($w - $width / $ratio) / 2;
            $w = $width / $ratio;
    }
    else{
 
            if($w < $width && $h < $height)
                return false; //еще меньше
 
            $ratio = min($width/$w, $height/$h);
            $width = $w * $ratio;
            $height = $h * $ratio;
            $x = 0;
    }
 
    $new = imagecreatetruecolor($width, $height);
    // прозрачность
    if($type == "gif" || $type == "png"){
        imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
        imagealphablending($new, false);
        imagesavealpha($new, true);
    }
    imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);
  
    $save = 'image' . $type;
 
    $save($new, $dst);
    return true;
}
пока все работает, ошибку не видел. но, буду очень признателен если профи этого форума проверять код на работоспособность
прошу посоветуйте: чего удалить а чего надо добавить
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2012, 10:24
Ответы с готовыми решениями:

Уменьшить размер фото предобавлении на сайт
Ребята помогите пожалуйста вот скрипт upload фото и watermark &lt;?php ...

Как задать размер фото в php коде напрямую?
Ребята подскажите как в этом куске кода задать размер фото ? $rez=count($am); if($rez&gt;0) {...

Изменить размер сохраняемого фото
как изменить размер сохраняемого фото через camera.takePicture? или нужно где то в другом месте...

как изменить размер фото....
есть ли возможность при загрузки пользователем фото на сайт, изменить его реальные размеры (вышину,...

7
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16826 / 6704 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.12.2012, 20:42 2
Кликните здесь для просмотра всего текста
Цитата Сообщение от AnomaIy Посмотреть сообщение
PHP
1
2
$imageinfo = getimagesize( $_FILES['myfile']['tmp_name'] );
list($width, $height) = getimagesize( $_FILES['myfile']['tmp_name'] );
зачем дважды?
PHP
1
list($width, $height, $extension) = getimagesize( $_FILES['myfile']['tmp_name'] );
тогда
Цитата Сообщение от AnomaIy Посмотреть сообщение
PHP
1
$ext = image_type_to_extension( $imageinfo[2] );
соответственно меняем на
PHP
1
$ext = image_type_to_extension( $extension );
Цитата Сообщение от AnomaIy Посмотреть сообщение
PHP
1
2
$randval = time();
* * * * * * $newname = "$randval$ext";
лишние переменные, имхо
PHP
1
$newname = time() . $ext;
и раз вы уже проверяете расширение в самом коде - незачем это повторять в функции.


код
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
<?php
    $api_key = 'MY APPI KEI';
    $result = 0;
    if( is_uploaded_file( $_FILES['myfile']['tmp_name'] ) ) {
        $enabled = array(1, 2, 3);
 
    list($width, $height, $extension) = getimagesize( $_FILES['myfile']['tmp_name'] );
 
        if( in_array( $extension, $enabled ) ) {
            $ext = image_type_to_extension( $extension, true );
            $newname =  time() . $ext;
 
            if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $newname))
            
                            if($width>1024 || $height>1024) {
                                  require './image_resize.php';
                                  echo (image_resize($newname, $newname, 1024, 768, $width, $height, $extension));
                }
 
    $handle = fopen($newname, 'r');
    $data = fread($handle, filesize($newname));
 
    $pvars   = array('image' => base64_encode($data), 'key' => $api_key);
    $timeout = 60;
    $curl    = curl_init();
    $post    = http_build_query($pvars);
 
    curl_setopt($curl, CURLOPT_URL, 'http://api.**********/1/upload.xml');
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $xml_raw = curl_exec($curl);
    curl_close ($curl);
    unlink($newname);
 
    $xml = new SimpleXMLElement($xml_raw);
 
    if ($xml->error_code != '') {
        $imgur_error_code = $xml->error_code;
        $imgur_error_msg = $xml->error_msg;
 
        settype($imgur_error_code, 'string');
        settype($imgur_error_msg, 'string');
 
    }
        else {
            imagedestroy($newname);
            $imgur_original = $xml->original_image;
 
            settype($imgur_original, 'string');
            $result = 1;        
        }
    }
        else { 
        }
    }
sleep(1);
?>
 
<script language="javascript" type="text/javascript">window.top.window.stopUpload(<?=$result; ?>,'<?=$imgur_original;?>');</script>
и сама функция, переделанная

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
<?php ini_set('memory_limit','500M'); //для больших фотографий
function image_resize($src, $dst, $width, $height, $w, $h, $type, $crop=0){
 
    $func = 'imagecreatefrom' . $type;
 
    if(!function_exists($func))
        return false;
 
    $img = $func($src);
  
    //изменение размера
    if($crop){
 
            if($w < $width || $h < $height)
                return false; //еще меньше
 
            $ratio = max($width/$w, $height/$h);
            $h = $height / $ratio;
            $x = ($w - $width / $ratio) / 2;
            $w = $width / $ratio;
    }
    else{
 
            if($w < $width && $h < $height)
                return false; //еще меньше
 
            $ratio = min($width/$w, $height/$h);
            $width = $w * $ratio;
            $height = $h * $ratio;
            $x = 0;
    }
 
    $new = imagecreatetruecolor($width, $height);
    // прозрачность
    if($type == "gif" || $type == "png"){
        imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
        imagealphablending($new, false);
        imagesavealpha($new, true);
    }
    imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);
  
    $save = 'image' . $type;
 
    $save($new, $dst);
    return true;
}


Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от AnomaIy Посмотреть сообщение
буду очень признателен если профи этого форума проверят
ждите, я к ним не отношусь :jokingly:

1
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 27
12.12.2012, 22:16  [ТС] 3
KOPOJI, спасибо еще раз



Цитата Сообщение от KOPOJI Посмотреть сообщение
и сама функция, переделанная
к сожалению он (новый код) не работает. не уменьшает размер.



хочу добавить в uploader.php
PHP
1
$enabled = array(1, 2, 3, 6);
6 - BMP
но видимо image_resizer.php не видит это расширение
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16826 / 6704 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
13.12.2012, 09:50 4
Цитата Сообщение от AnomaIy Посмотреть сообщение
к сожалению он (новый код) не работает. не уменьшает размер.
странно, должен.
Цитата Сообщение от AnomaIy Посмотреть сообщение
6 - BMP
но видимо image_resizer.php не видит это расширение
нет, просто нет такой функции imagebmp() - есть imagewbmp() или image2wbmp(), но я с ними не работал, поэтому не знаю, для bmp это или нет.

Добавлено через 4 минуты
проверил, работает функция сам код функции не менял, вызывал так:
PHP
1
image_resize('./general.jpg', './general2.jpg', 1024, 768, 10386, 4890, 'jpeg');
Добавлено через 1 минуту
результат - из jpeg-картинки с размером 10386x4890 px на выходе jpeg-картинка с размером 1024х482 px

Добавлено через 1 минуту
тоже самое если сохранять с тем же именем, с заменой
1
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 27
18.06.2013, 13:19  [ТС] 5
Здравствуйте

Столкнулся с проблемой ...

кусочек из uploader.php
PHP
1
2
3
4
5
                if(@move_uploaded_file($_FILES['myfile']['tmp_name'], "$upload_folder/" . $newname))
                    if($width>1024 || $height>768) {
                        require './image_resize.php';
                        echo (image_resize("$upload_folder/" . $newname, "$upload_folder/" . $newname, 1024, 768, $width, $height, $extension));
                    }

image_resize.php
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
<?php ini_set('memory_limit','500M');
function image_resize($src, $dst, $width, $height, $crop=0){
 
    if(!($pic = @getimagesize($src)))
        return false;
 
    $w = $pic[0];
    $h = $pic[1];
    $type = substr($pic['mime'], 6);
 
    $func = 'imagecreatefrom' . $type;
 
    if(!function_exists($func))
        return false;
 
    $img = $func($src);
 
    if($crop){
 
            if($w < $width || $h < $height)
                return false;
 
            $ratio = max($width/$w, $height/$h);
            $h = $height / $ratio;
            $x = ($w - $width / $ratio) / 2;
            $w = $width / $ratio;
    }
    else{
 
            if($w < $width && $h < $height)
                return false;
 
            $ratio = min($width/$w, $height/$h);
            $width = $w * $ratio;
            $height = $h * $ratio;
            $x = 0;
    }
 
    $new = imagecreatetruecolor($width, $height);
 
    if($type == "gif" || $type == "png"){
        imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
        imagealphablending($new, false);
        imagesavealpha($new, true);
    }
    imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);
 
    $save = 'image' . $type;
 
    $save($new, $dst);
    return true;
}
Все это работает если размер картинки например = 1500x900

Но если размер картинки равна например 1242x331 то тогда картинка остается нетронутым, без изменений размеров до 1024x?
0
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 27
23.06.2013, 12:31  [ТС] 6
UP

---------------------------------------------------------
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16826 / 6704 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.08.2013, 11:41 7
Цитата Сообщение от AnomaIy Посмотреть сообщение
image_resize("$upload_folder/" . $newname, "$upload_folder/" . $newname, 1024, 768, $width, $height, $extension)
В примере выше ошибка, слишком много параметров передано. Это был вызов переделанной функции (под спойлером), а вы взяли не переделанную. Выделенное красным - лишнее, там должно быть либо 0, либо 1. 1 означает, что изображение будет обрезаться до этого размера (не пропорционально), 0 означает, что изображение будет ресайзится пропорционально. Но, на всякий, исправьте в моем коде
Цитата Сообщение от AnomaIy Посмотреть сообщение
PHP
1
if($w < $width || $h < $height)
на
PHP
1
if($w < $width && $h < $height)
просто мне надо было только если только обе стороны меньше, а чаще всего требуется, если хотя бы одна (судя по количеству вопросов)
1
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 27
02.08.2013, 14:20  [ТС] 8
большое спасибо за ваше внимание!

все работает отлично!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2013, 14:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Какой максимальный размер файла, передаваемого по протоколу TCP?
Какой максимальный размер файла, передаваемого по протоколу TCP, средствами Indy?

Как изменить размер TImage под текущий размер Picture ?
Доброго времени суток! Есть задача (Delphi 7). В TImage загружается Picture с условиями: Center...

Уменьшить размер фото
Вот коды &lt;li id=&quot;page_Portfolio&quot;&gt; &lt;div class=&quot;box1&quot;&gt; &lt;div...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.