Разница между Imagick::thumbnailImage() и Imagick::adaptiveResizeImage()
Во-первых, я знаю Imagick::resizeImage
дает мне больше возможностей.
Кто-нибудь может сказать мне, какие фильтры используют два метода?
Кажется, они создают почти идентичные изображения, за исключением того, что (на моем тестовом изображении) изображение thumbnailImage() смещено на один пиксель в верхнем левом углу.
ОБНОВИТЬ
Я обнаружил, что эти два метода являются ImageMagick's MagickThumbnailImage
а также MagickAdaptiveResizeImage
, В их документации не указано, какие фильтры используются.
1 ответ
Цепочка вызовов, выполняемых с помощью thumbnailImage, - это MagickThumbnailImage -> ResizeImage, где тип фильтра LanczosFilter, по-видимому, устанавливается по умолчанию (если каким-то образом изображение не имеет фильтра, связанного с ним).
Цепочка вызовов для изображения adaptiveResize имеет вид MagickAdaptiveResizeImage -> AdaptiveResizeImage -> InterpolativeResizeImage(изображение, столбцы, строки,MeshInterpolatePixel) -> InterpolateMagickPixelPacket
Код внутри InterpolateMagickPixelPacket для типа "пиксель с интерполяцией сетки" приведен ниже.
case MeshInterpolatePixel:
{
PointInfo
delta,
luma;
p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,
exception);
if (p == (const PixelPacket *) NULL)
{
status=MagickFalse;
break;
}
indexes=GetCacheViewVirtualIndexQueue(image_view);
for (i=0; i < 4L; i++)
{
GetMagickPixelPacket(image,pixels+i);
AlphaBlendMagickPixelPacket(image,p+i,indexes+i,pixels+i,alpha+i);
}
delta.x=x-x_offset;
delta.y=y-y_offset;
luma.x=fabs(MagickPixelLuma(pixels+0)-MagickPixelLuma(pixels+3));
luma.y=fabs(MagickPixelLuma(pixels+1)-MagickPixelLuma(pixels+2));
if (luma.x < luma.y)
{
/*
Diagonal 0-3 NW-SE.
*/
if (delta.x <= delta.y)
{
/*
Bottom-left triangle (pixel:2, diagonal: 0-3).
*/
delta.y=1.0-delta.y;
gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
gamma=PerceptibleReciprocal(gamma);
pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
pixels[3].red,pixels[0].red);
pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
pixels[3].green,pixels[0].green);
pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
pixels[3].blue,pixels[0].blue);
if (image->colorspace == CMYKColorspace)
pixel->index=gamma*MeshInterpolate(&delta,pixels[2].index,
pixels[3].index,pixels[0].index);
gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
pixel->opacity=gamma*MeshInterpolate(&delta,pixels[2].opacity,
pixels[3].opacity,pixels[0].opacity);
}
else
{
/*
Top-right triangle (pixel:1, diagonal: 0-3).
*/
delta.x=1.0-delta.x;
gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
gamma=PerceptibleReciprocal(gamma);
pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
pixels[0].red,pixels[3].red);
pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
pixels[0].green,pixels[3].green);
pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
pixels[0].blue,pixels[3].blue);
if (image->colorspace == CMYKColorspace)
pixel->index=gamma*MeshInterpolate(&delta,pixels[1].index,
pixels[0].index,pixels[3].index);
gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
pixel->opacity=gamma*MeshInterpolate(&delta,pixels[1].opacity,
pixels[0].opacity,pixels[3].opacity);
}
}
else
{
/*
Diagonal 1-2 NE-SW.
*/
if (delta.x <= (1.0-delta.y))
{
/*
Top-left triangle (pixel: 0, diagonal: 1-2).
*/
gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
gamma=PerceptibleReciprocal(gamma);
pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
pixels[1].red,pixels[2].red);
pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
pixels[1].green,pixels[2].green);
pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
pixels[1].blue,pixels[2].blue);
if (image->colorspace == CMYKColorspace)
pixel->index=gamma*MeshInterpolate(&delta,pixels[0].index,
pixels[1].index,pixels[2].index);
gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
pixel->opacity=gamma*MeshInterpolate(&delta,pixels[0].opacity,
pixels[1].opacity,pixels[2].opacity);
}
else
{
/*
Bottom-right triangle (pixel: 3, diagonal: 1-2).
*/
delta.x=1.0-delta.x;
delta.y=1.0-delta.y;
gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
gamma=PerceptibleReciprocal(gamma);
pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
pixels[2].red,pixels[1].red);
pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
pixels[2].green,pixels[1].green);
pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
pixels[2].blue,pixels[1].blue);
if (image->colorspace == CMYKColorspace)
pixel->index=gamma*MeshInterpolate(&delta,pixels[3].index,
pixels[2].index,pixels[1].index);
gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
pixel->opacity=gamma*MeshInterpolate(&delta,pixels[3].opacity,
pixels[2].opacity,pixels[1].opacity);
}
}
break;
}
Так что он не использует один из определенных фильтров.