ImageMagick-6.9.3-7差分

ImageMagick-6.9.3-6差分 - yoyaのメモの続き

The latest release of ImageMagick is version 6.9.3-7

まとめ

  • TXT形式画像変換の修正
  • SVG と EMF で -size 指定を使えるように(?)
  • - label: / coder: の文字列の並びを修正
  • wevelet denoise フィルタの修正 (% 指定で sigma を計算し忘れてた)
  • -fx 処理の高速化(オフセット計算を減らしてる)

差分

ChangeLog の分

  • -size が以下のベクター形式で width/height の最大値指定として使える
    • SVG (librsvg と cairo が使われた時)
>         if (image_info->size != (char *) NULL)
>           {
>             (void) GetGeometry(image_info->size,(ssize_t *) NULL,
>               (ssize_t *) NULL,&image->columns,&image->rows);
>             if ((image->columns != 0) || (image->rows != 0))
>               {
>                 image->x_resolution=90.0*image->columns/dimension_info.width;
>                 image->y_resolution=90.0*image->rows/dimension_info.height;
>                 if (image->x_resolution == 0)
>                   image->x_resolution=image->y_resolution;
>                 else if (image->y_resolution == 0)
>                   image->y_resolution=image->x_resolution;
>                 else
>                   image->x_resolution=image->y_resolution=MagickMin(
>                     image->x_resolution,image->y_resolution);
>               }
>           }
    • EMF (Windows で動かなかった)
      • coders/emf.c
> static inline void EMFSetDimensions(Image * image,Gdiplus::Image *source)
> {
>   if ((image->x_resolution <= 0.0) || (image->y_resolution <= 0.0))
>     return;
>
>   image->columns=(size_t) floor((Gdiplus::REAL) source->GetWidth()/
>     source->GetHorizontalResolution()*image->x_resolution+0.5);
>   image->rows=(size_t)floor((Gdiplus::REAL) source->GetHeight()/
>     source->GetVerticalResolution()*image->y_resolution+0.5);
> }

ChangeLogにない差分

  • Magick++/lib/Image.cpp
    • waveletDenose の引数に softness_ 追加
< void Magick::Image::waveletDenoise(const double threshold_)
---
> void Magick::Image::waveletDenoise(const double threshold_,
>   const double softness_)
  • magick/annotate.c
<             ft_status=FT_Get_Kerning(face,last_glyph,(*grapheme)[i].index,
<               ft_kerning_default,&kerning);
---
>             ft_status=FT_Get_Kerning(face,(FT_UInt) last_glyph,(FT_UInt)
>               (*grapheme)[i].index,ft_kerning_default,&kerning);
  • magick/fx.c
    • double 配列での処理を float に変更。sizeof(*kernel) を乗算してメモリ確保してるのでオーバーランしてた訳でもない。
<   kernel=(double *) AcquireQuantumMemory(MagickMax(image->rows,image->columns),
---
>   kernel=(float *) AcquireQuantumMemory(MagickMax(image->rows,image->columns)
    • 高速化っぽい。オフセットを毎回計算し直さずにポインタのオフセットをずらす方式にしてる。
<   /*
<     Low pass filter outputs are called approximation kernel & high pass
<     filters are referred to as detail kernel.  The detail kernel
<     have high values in the noisy parts of the signal.
<   */
<   for (i=0; i < (ssize_t) radius; i++)
<     kernel[i]=2.0*pixels[width*i]+pixels[width*(radius-i)]+
<       pixels[width*(i+radius)];
<   for ( ; (i+radius) < (ssize_t) height; i++)
<     kernel[i]=2.0*pixels[width*i]+pixels[width*(i-radius)]+
<       pixels[width*(i+radius)];
<   for ( ; i < (ssize_t) height; i++)
<     kernel[i]=2.0*pixels[width*i]+pixels[width*(i-radius)]+
<       pixels[width*(2*height-2-(i+radius))];
---
>   p=pixels;
>   q=pixels+scale*stride,
>   r=pixels+scale*stride;
>   for (i=0; i < (ssize_t) scale; i++)
>   {
>     kernel[i]=0.25f*(*p+(*p)+(*q)+(*r));
>     p+=stride;
>     q-=stride;
>     r+=stride;
>   }
>   for ( ; i < (ssize_t) (extent-scale); i++)
>   {
>     kernel[i]=0.25f*(2.0f*(*p)+*(p-scale*stride)+*(p+scale*stride));
>     p+=stride;
>   }
>   q=p-scale*stride;
>   r=pixels+stride*(extent-2);
>   for ( ; i < (ssize_t) extent; i++)
>   {
>     kernel[i]=0.25f*(*p+(*p)+(*q)+(*r));
>     p+=stride;
>     q+=stride;
>     r-=stride;
>   }
    • こちらも同様
>           *magick_restrict p,
>           *magick_restrict q;
>
5906,5907c5923,5926
<         HatTransform(pixels+y*image->columns+high_pass,1,image->columns,
<           1UL << level,kernel+id*image->columns);
---
>         p=kernel+id*image->columns;
>         q=pixels+y*image->columns;
>         HatTransform(q+high_pass,1,image->columns,(size_t) (1 << level),p);
>         q+=low_pass;
5909c5928
<           pixels[y*image->columns+x+low_pass]=0.25*kernel[id*image->columns+x];
---
>           *q++=(*p++);
5919a5939,5942
>         register float
>           *magick_restrict p,
>           *magick_restrict q;
>
5923,5924c5946,5948
<         HatTransform(pixels+x+low_pass,image->columns,image->rows,1UL << level,
<           kernel+id*image->rows);
---
>         p=kernel+id*image->rows;
>         q=pixels+x+low_pass;
>         HatTransform(q,image->columns,image->rows,(size_t) (1 << level),p);
5926c5950,5953
<           pixels[y*image->columns+x+low_pass]=0.25*kernel[id*image->rows+y];
---
>         {
>           *q=(*p++);
>           q+=image->columns;
>         }
6008c6035
  • magick/geometry.c
    • width, height で NULL を受け取れるようにした
>           if (width != (size_t *) NULL)
>             {
229a232
>             }
245a249
>               if (height != (size_t *) NULL)
263a268
>       if (x != (ssize_t *) NULL)
268c273
<           if ((flags & XNegative) != 0)
---
>           if (((flags & XNegative) != 0) && (x != (ssize_t *) NULL))
283a289
>       if (y != (ssize_t *) NULL)
288c294
<           if ((flags & YNegative) != 0)
---
>           if (((flags & YNegative) != 0) && (y != (ssize_t *) NULL))
295a302
>           if ((height != (size_t *) NULL) && (width != (size_t *) NULL))
299c306,307
<       if (((flags & SeparatorValue) != 0) && ((flags & WidthValue) == 0))
---
>       if (((flags & SeparatorValue) != 0) && ((flags & WidthValue) == 0) &&
>           (height != (size_t *) NULL) && (width != (size_t *) NULL))
  • magick/memory.c
    • lseek が失敗した時のケアが入った。ファイルが確保できない場合に問題だったはず
<               if ((lseek(file,extent-1,SEEK_SET) == (extent-1)) &&
---
>               MagickOffsetType
>                 offset;
>
>               offset=(MagickOffsetType) lseek(file,extent-1,SEEK_SET);
>               if ((offset == (MagickOffsetType) (extent-1)) &&
  • wand/mogrify.c
    • % 指定の時に rho だけでなく sigma も計算する
3302c3302,3305
<               geometry_info.rho=(double) QuantumRange*geometry_info.rho/100.0;
---
>               {
>                 geometry_info.rho=QuantumRange*geometry_info.rho/100.0;
>                 geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0;
>               }

(調査中)

ChangeLog

2016-03-26  6.9.3-7 Cristy  <quetzlzacatenango@image...>
  * New version 6.9.3-7, GIT revision 10628:810a9fe:20160306

2016-03-05  6.9.3-7 Dirk Lemstra <dirk@lem.....org>
  * -size can now be used the specify the maximum width/height for the
    following vector formats:
      * SVG (when librsvg and cairo are being used).
      * EMF (did not work on Windows).

2016-02-29  6.9.3-7 Cristy  <quetzlzacatenango@image...>
  * Fixed text alignment issue for label: / coder: (reference
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=29223).