Легкое размытие при работе РНР с картинками

Oniks
На сайте с 22.08.2005
Offline
176
2622

Итак, вопрос такой:"Может ли РНР слегка размывать изображение?" Поясню - при изготовлении уменьшенной копии jpg, края приобретают зубчатость, да и сама картинка получается очень стремная. Можно ли с этим как-то бороться, там размытие в 0,2% применять, например, или еще как. Я понимаю, что алгоритмы работы РНР с изображениями далеки от Фотошопа, но тем не менее...

Профессиональные услуги фотографа в Москве и области (http://www.oniks-photo.ru/) покупаю стать и ссылки с сайтов про охоту
admad
На сайте с 22.06.2004
Offline
126
#1

GD тебе поможет, или ImageMagik

Oniks
На сайте с 22.08.2005
Offline
176
#2
admad:
GD тебе поможет, или ImageMagik

Гм... а разьве imagecreatefromjpeg() и imagecreatetruecolor() не является GD?

Т
На сайте с 16.01.2005
Offline
53
#3

Получайте цвета каждого пикселя и с помощью матрицы размывайте насколько это нужно.

Пример

Матрица 3х3

1 1 1

1 8 1

1 1 1

Накладываете эту матрицу на изображение. Далее работаете отдельно с каждой из составляющих цвета. Перемножаете составляющие цвета соответствующей точки на соответствующий ей коэффициент матрицы. Все складываете и делите на сумму элементов матрицы. Получаете составляющую цвета центральной по отношению к матрице точки. И так для каждой точки изображения.

Т
На сайте с 16.01.2005
Offline
53
#4

Вот функция на с++ для наложения матрицы. От php отличается не сильно.


void impose_matrix(int ***mass, int matrix[3][3], int width, int height)
{
int divider, sum_0, sum_1, sum_2;
for(int x=0; x<width; x++)
{
for(int y=0; y<height; y++)
{
sum_0 = mass[x][y][0]*matrix[1][1];
sum_1 = mass[x][y][1]*matrix[1][1];
sum_2 = mass[x][y][2]*matrix[1][1];
divider = matrix[1][1];

if(x-1>0)
{
sum_0 += mass[x-1][y][0]*matrix[0][1];
sum_1 += mass[x-1][y][1]*matrix[0][1];
sum_2 += mass[x-1][y][2]*matrix[0][1];
divider += matrix[0][1];
}
if(x+1<width-1)
{
sum_0 += mass[x+1][y][0]*matrix[2][1];
sum_1 += mass[x+1][y][1]*matrix[2][1];
sum_2 += mass[x+1][y][2]*matrix[2][1];
divider += matrix[2][1];
}
if(x-1>0 && y-1>0)
{
sum_0 += mass[x-1][y-1][0]*matrix[0][0];
sum_1 += mass[x-1][y-1][1]*matrix[0][0];
sum_2 += mass[x-1][y-1][2]*matrix[0][0];
divider += matrix[0][0];
}
if(x+1<width-1 && y-1>0)
{
sum_0 += mass[x+1][y-1][0]*matrix[2][0];
sum_1 += mass[x+1][y-1][1]*matrix[2][0];
sum_2 += mass[x+1][y-1][2]*matrix[2][0];
divider += matrix[2][0];
}
if(y-1 > 0)
{
sum_0 += mass[x][y-1][0]*matrix[1][0];
sum_1 += mass[x][y-1][1]*matrix[1][0];
sum_2 += mass[x][y-1][2]*matrix[1][0];
divider += matrix[1][0];
}
if(x-1>0 && y+1<height-1)
{
sum_0 += mass[x-1][y+1][0]*matrix[0][2];
sum_1 += mass[x-1][y+1][1]*matrix[0][2];
sum_2 += mass[x-1][y+1][2]*matrix[0][2];
divider += matrix[0][2];
}
if(x+1<width-1 && y+1<height-1)
{
sum_0 += mass[x+1][y+1][0]*matrix[2][2];
sum_1 += mass[x+1][y+1][1]*matrix[2][2];
sum_2 += mass[x+1][y+1][2]*matrix[2][2];
divider += matrix[2][2];
}
if(y+1<height-1)
{
sum_0 += mass[x][y+1][0]*matrix[1][2];
sum_1 += mass[x][y+1][1]*matrix[1][2];
sum_2 += mass[x][y+1][2]*matrix[1][2];
divider += matrix[1][2];
}

mass[x][y][0] = (int)(sum_0/divider);
mass[x][y][1] = (int)(sum_1/divider);
mass[x][y][2] = (int)(sum_2/divider);
}
}
}
NetBot
На сайте с 26.10.2005
Offline
172
#5

вот готовый код:

http://phpclub.ru/talk/showthread.php?s=&threadid=78088&rand=7

размытие+шарпен.. в итоге превьюхи получаются как в фотошопе.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий