yoyaのメモ

2017/03/25(Sat) ImageMagick-6.9.8-2差分

[]ImageMagick-6.9.8-3差分

ImageMagick-6.9.8-2差分 - yoyaのメモの続き

The latest release of ImageMagick is version 6.9.8-3

まとめ

  • MagickWand-config で --cppflags の時に --clags だったのを --cflags に修正。
  • animate -window で -loop 指定が効かないのを修正

差分

47c47
    --cflags)
      pkg-config --cflags MagickWand
      ;;
    --cxxflags)
      pkg-config --cflags MagickWand
      ;;
    --cppflags)
<       pkg-config --clags MagickWand
---
>       pkg-config --cflags MagickWand
      ;;
751a752
>     delay,
753a755,757
>   ssize_t
>     iterations;
>
770,772d773
<   size_t
<     delay;
<
1136a1138
>   iterations=0;
1156a1159,1161
>     iterations++;
>     if (iterations == (ssize_t) image_list[0]->iterations)
>       break;
ChangeLogにない差分
  • magick/random.c
    •  GenerateEntropicChaos で mkstemp を使うルート。ランダム文字を入れるプレースフォルダが XXXXXX なので、それに合わせた。
<     (void) GetPathTemplate(path);
---
>     (void) strcpy(path,"XXXXXX");
   file=mkstemp(path);
  • magick/utility.c
    • GetPathComponent 一文字目が : の時に除外する。でないと : の1文字が component になる。
1230c1230
<     if ((*p == ':') && (IsPathDirectory(path) < 0) &&
---
>     if ((p != component) && (*p == ':') && (IsPathDirectory(path) < 0) &&

ChangeLog

2017-03-24  6.9.8-3 Cristy  <quetzlzacatenango@image...>
  * Release ImageMagick version 6.9.7-3, GIT revision 11444:3f523e5:20170324.

2017-03-20  6.9.8-3 Cristy  <quetzlzacatenango@image...>
  * MagickWand-config, use --cflags, not --clags (reference
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=31602).
  * Respect -loop option for animate -window (reference
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=31619).

2017/03/22(Wed) Users prefer Guetzli JPEG over same-sized libjpeg (和訳)

Users prefer Guetzli JPEG over same-sized libjpeg (和訳)

J. Alakuijala, R. Obryk, Z. Szabadka, and J. Wassenberg

Google Research

March 14, 2017

Abstract

We report on pairwise comparisons by human raters of JPEG images

from libjpeg and our new Guetzli encoder. Although both files are

size-matched, 75% of ratings are in favor of Guetzli. This implies the

Butteraugli psychovisual image similarity metric which guides Guetzli

is reasonably close to human perception at high quality levels. We

provide access to the raw ratings and source images for further analysis

and study.

1 Introduction

Guetzli is a new JPEG encoder that uses the recently introduced Butteraugli

psychovisual similarity metric to make rate/distortion decisions. Thus,

Guetzli produces images that Butteraugli believes to be ‘better’ than standard

libjpeg. We undertook an experiment to see whether humans agree with

this assessment. The settings are very simple: we have pairwise comparisons

between size-matched images, both in standard JPEG format, and see

whether human raters prefer one or the other.

2 Materials and Methods

2.1 Source images

To ensure a meaningful evaluation of compressor quality and output size, we

create a 31-image dataset with known source and processing. The images

are publicly available [1].

We reduce JPEG artifacts by capturing images at the highest JPEG

quality level using a Canon EOS 600d camera and downsampling the resulting

images by 4x4 using Lanczos resampling, as implemented in GIMP.

Photographers often apply unsharp masking to compensate for downsampling,

so we also apply it in most of the images before downsampling. The

degree of unsharp masking is chosen arbitrarily, but before any compression

experiments. The images are chosen to cover a wide range of contents,

including nature, humans, smooth gradients, high-frequency detail, with

relatively thorough coverage of the sRGB gamut.

2.2 Image degradation method

We are testing two compressors which offer a distortion vs size trade-off via a

single quality parameter. Guetzli is designed for high-quality, visually lossless

compression, so we choose its quality parameter to be 94, which results in a

rate of approximately 2.6 bits per pixel. For each guetzli-compressed image,

we generate a JPEG image for comparison by invoking ImageMagick 6.7 via

convert -sampling-factor 1x1 with decreasing quality parameter until

the libjpeg output is smaller than the guetzli JPEG. The final libjpeg JPEG

file is generated at the next higher quality level, which guarantees it is at

least as large as (and typically larger than) the Guetzli file. Note that the

scale of the resulting libjpeg quality parameters is slightly different; we see a

minimum of 83, maximum 93, average 89.4 and median 90. Both compressors

produce a standard-conformant JPEG bitstream.

Before display, we upsample both images by a factor of two using nearest

neighbor sampling (i.e. pixel replication) and crop them to 900x900 pixels

starting at the top-left corner so that the images fit on our screen.

2.3 Viewing environment

To reduce the variability of the comparison results, e.g. due to differences

in monitor gamut, panel bit depth and processing/LUTs, we perform all

tests on a single monitor. A calibrated 27” NEC PA272 includes a 10-bit

panel while still being reasonably commercially available. We choose viewing

conditions that match a typical office environment.

2.4 Experiment design

We choose a pairwise comparison model. To avoid the need for a break, we

present the 31 images once in a single session, typically 20 to 30 minutes. We

provide a custom OpenGL viewer that alternates between the two compressed

variants on the right half of the screen, while displaying the uncompressed

original image on the left side. The presentation order of each image is

chosen randomly, and we swap between them at a fixed rate of 0.44 Hz. To

reset perception between the two images, we fade the screen to mid-gray

over 250 ms and hold it at gray for 600 ms. Our instructions are to click

upon the less preferable image, at the location of the most visible artifact.

To reduce the likelihood of random guesses, we leave open the option of

skipping images when there is no discernible difference.

Subjects are asked to sit at a distance of 3-4 picture heights from the

screen in order to reduce eye movements when comparing with the original

image. We provide a brief explanation and training, including the example

of clicking on a location.

2.5 Subjects

23 raters participated in our experiment. Their age range spans 25-46 years

(median 31). 56.5% (13) are women. All but three subjects report correctedto-normal

vision; one is red-green color blind, one has slightly higher visual

acuity and one has slightly lower acuity. Subjects are recruited via convenience

sampling from Google employees working nearby, or known to us.

We attempt to equalize the gender ratio and include several experienced

photographers, but most subjects are not experienced in the field of image

compression and only informed that they are comparing two compressors.

3 Results

Each subject generated 11 to 31 answers, with a mean of 26 and median of

29. The raw ratings are listed below. Overall, 75% of decisions were in favor

of Guetzli, i.e. the rater decided that the corresponding libjpeg image was

worse. There was only moderate variation among images; the interquartile

range is 85%-68%. In one extreme, only 22% preferred the Guetzli encoding

of the ‘cloth’ image, apparently due to loss of detail in the pink goggles.

Conversely, raters unanimously preferred the Guetzli encoding of ‘bees’.

The number of ratings for each image was relatively consistent (quartiles

19, 20, 21), which implies raters skipped different images. Assuming image

preferences are ‘uncertain’ if the image was in the lower quartile of number of

ratings, discarding those images raises the median preference for Guetzli to

80%. Note that this analysis method was devised after the data was collected,

so it is possible the sampling method is biased towards a particular outcome.

Although discarding images that received the fewest ratings seems reasonable,

we must ignore this conclusion and only report the 75% preference from the

full dataset, listed below for completeness.

The ratings are listed in matrix form, one row per image, in decreasing

order of total rating decisions. Each column (corresponding to the rater’s

index) indicates which is worse: L for libjpeg, G for Guetzli or blank if the

image was skipped.

out-of-focus: LLLLLLGLLLLLLLLLGG LLLL
white-yellow: LLLGLLGLL LLLLLG LLLLGG
 brake-light: LLLLLLLLG LGLGLLLG GL L
 pink-flower: LLLLLLLLL  LGLGG GLLLLL
    wollerau: LLLLGLGLLGLLLLLGLLLLLLL
 red-flowers: LLGGLGLLL LLL LLLL LLGG
   geranium2: LLLLGL LLLLLLGLGLLLLLLL
  green-rose: LGLLLLGGL G LLLG G LLLL
    bicycles: LLLLLLLLLGLLG GLL LLLLL
   blue-rose: LLLGLLGLLLG GLLL L LLLG
  pimpinelli: LLLGGL LL L LL GLLLLLLL
  minerology: LLLLLL LL L GLLG LLLLGG
    red-room: LLLLGLGLGL LL LL GLLLLL
     yellow2: LLLLLL LLGLLLGLL GLLLLL
        stp2: LLLLGLLLLLLLLLLLLLLLLLL
     vflower: LLLLLL LLLLLGLGG LLLLG
        port: LLLLGLLLLGLLLLLGLL LLLL
     station: LGLGLLGGLLGGLLG    LLLL
      yellow: LGLGLLLGLGLLLLG   LLLLG
      bench2: LGLGGLLLLL  GLGL LGLLLG
    red-rose: LLGLLL LGL GGGGG L GL
    geranium: LGLLGL LLGG GG L   GLLL
         stp: LGLLLLGLLGGLLGLL LLLLLL
     rainbow: GGGGLG LGLG G LL G GGLG
       bench: LLLGGLLLLL  GLGL L LLGG
         rgb: LLLLGG LLGLLLGL LLLLLLG
       cloth: GLGGGGGGLLLGG  G G GG G
      lichen: LGLGLLLLL GLG L  L  LGL
        bees: LLLLLLLLL LLL LL  LLLLL
       green: LLLLLL LL LLLLL    LLLG
        hand: GGL GL LL LGGLLLGL L LL

2017/03/20(Mon) Guetzli: Perceptually Guided JPEG Encoder (和訳)

Guetzli: Perceptually Guided JPEG Encode (和訳)

J. Alakuijala, R. Obryk∗ , O. Stoliarchuk, Z. Szabadka, L. Vandevenne, and J. Wassenberg Google Research Europe March 14, 2017

* robryk@google.com

Abstract

Guetzli is a new JPEG encoder that aims to produce visually indistinguishable images at a lower bit-rate than other common JPEG encoders.

Guetzliは、他の一般的なJPEGエンコーダよりも低いビットレートで視覚的に区別できない画像を生成することを目指す新しいJPEGエンコーダです。

It optimizes both the JPEG global quantization tables and the DCT coefficient values in each JPEG block using a closed-loop optimizer.

これは、JPEGの各グローバル量子化テーブルとDCT係数値をJPEGの両方を閉ループオプティマイザを使って最適化します。

※最適解が出るまでループ試行する手法

Guetzli uses Butteraugli [1], our perceptual distance metric, as the source of feedback in its optimization process.

Guetzliは、最適化プロセスにおけるフィードバック源として、我々の知覚距離メトリックであるButteraugli [1]を使用しています。

We reach a 29-45% reduction in data size for a given perceptual distance, according to Butteraugli, in comparison to other compressors we tried.

Butteraugliによると、私たちが試した他のコンプレッサと比較して、知覚距離のデータサイズが29-45%減少しています。

Guetzli’s computation is currently extremely slow, which limits its applicability to compressing static content and serving as a proof-of-concept that we can achieve significant reductions in size by combining advanced psychovisual models with lossy compression techniques.

Guetzliの計算は現在非常に遅く、静的コンテンツを圧縮することに応用範囲が限定されていて、先進的な心理感覚モデルと損失圧縮技術を組み合わせることでサイズの大幅な縮小を達成できるという概念の証明(proof-of-concept)を助けるものです。

1 Introduction

Two thirds of the average web page size are spent on representations of images: JPEGs, GIFs and PNGs; almost half of the image requests are JPEGs, which tend to be much larger in byte size than PNGs and GIFs [2].

Webページの平均サイズの3分の2は、JPEGGIFPNGのような画像の表現に費やされます。画像リクエストのほぼ半分がJPEGであり、PNGGIFよりもバイトサイズがはるかに大きい傾向があります[2]。

Given that many clients and particularly mobile clients are limited by transfer bandwidth, we can make websites load faster by reducing the size of JPEG images.

多くのクライアント、特にモバイルクライアントは転送帯域幅によって制限されるため、JPEG画像のサイズを縮小することでウェブサイトの読み込み速度を向上させることができます。

Standard JPEG encoders allow trading off visual quality against size by tuning the quality parameter.

標準のJPEGエンコーダでは、quality パラメータを調整することで、サイズに対する視覚的品質のトレードオフが出来ます。

In this work we look into how to reduce the size of JPEG images without impacting the perceived visual quality of the images.

この作品では、画像の知覚される視覚的品質に影響を与えることなく、JPEG画像のサイズを縮小する方法を検討します。

f:id:yoya:20170320131421j:image

Figure 1: Visualization of two details in an image, original in the left column, Guetzli in the middle, libjpeg on the right. Libjpeg shows more ringing artifacts than Guetzli.

図1:イメージの2つの詳細の視覚化、左の列のオリジナル、中央のGuetzli、右のlibjpeg。LibjpegはGuetzliよりも多くのリンギングアーティファクトを示しています。

We visually observed that JPEGs encoded with existing encoders typically have inhomogeneous quality; they often exhibit disturbing artifacts only in a few places on the image.

我々は、既存のエンコーダエンコードされたJPEGは通常、品質が不均一であることを視覚的に観察しました。それらはしばしば画像上のいくつかの場所でのみ不自然なアーチファクトを示します。

Often areas close to sharp edges or lines exhibit more visible artifacts (e.g. as in Fig. 1).

鋭いエッジまたは線に近い領域は、より目に見えるアーチファクトを示すことがよくあります(図1のように)。

This led us to think that further optimization is possible.

これにより、さらなる最適化が可能であると考えました。

We assume that when an encoder throws away information in an efficient manner, the JPEG image should start to degrade roughly evenly everywhere when the degradation starts to become visible.

エンコーダが効率的に情報を捨て去ると、JPEG画像は、劣化が目に見えるようになるとどこでもほぼ均等に劣化し始めると仮定します。

With Guetzli we attempt to cause a degradation in visual quality that is both more homogeneous and yields smaller JPEG images.

Guetzliでは、より均質で、より小さなJPEG画像を生成する視覚品質の低下を引き起こそうとします。

Guetzli is an open source JPEG encoder [3] that targets very high perceptual qualities. It performs a closed-loop optimization, with feedback provided by Butteraugli, our model of human vision [1]. Its goal is to find the smallest JPEG which cannot be distinguished from the original image

Guetzliは、非常に高い知覚品質を目標とするオープンソースJPEGエンコーダ[3]です。人間の視覚モデルであるButteraugli [1]によってフィードバックが提供され、閉ループオプティマイザが実行されます。その目的は、元の画像と区別できない最小のJPEGを見つけることです

f:id:yoya:20170320131736j:image

Figure 2: Experiment with additive blue channel signal on black and yellow backgrounds shows that blue changes are more difficult to see on the yellow background.

図2:黒色と黄色のバックグラウンドでの青色チャネル信号の追加による実験では、青色の変化が黄色の背景で見にくいことがわかります。

Receptors (cones) at retina receive the colors in such a way that different components can mask changes in other components.

網膜の受容体錐体)は、異なるコンポーネントが他のコンポーネントの変化を隠すことができるように色を受けつけます。

Here, we show how changes in the low intensity blue component are masked by the high intensity levels in the red and green components.

ここでは、低輝度の青色成分の変化が、赤色成分および緑色成分の高強度レベルによってどのようにマスクされるかを示します。

The same differences in blue are more difficult to see against a yellow background than against the black background.

青色の同じ違いは、黒色の背景より黄色の背景に対して見にくいです。

By using Butteraugli, Guetzli detects the lesser importance of blue on a yellow background and stores it with less accuracy.

Butteraugliを使用することで、Guetzliは黄色の背景に青色の重要性が低いことを検出し、それをあまり正確に保存しません。

by the human eye according to Butteraugli. Butteraugli takes into account three properties of vision that most JPEG encoders do not make use of.

Butteraugliによれば人間の目によって。Butteraugliは、ほとんどのJPEGエンコーダが使用しない3つの視覚特性を考慮に入れています。

First, due to the overlap of sensitivity spectra of the cones, gamma correction should not be applied to every RGB channel separately.

第1に、錐体の感度スペクトルの重なりのために、ガンマ補正をRGBチャネルごとに別々に適用すべきではない。

There is some relationship between e.g. amount of yellow light seen and sensitivity to blue light.

例えば、黄色光の量と青色光に対する感度との間にはいくらかの関係がありいます。

Thus, changes in blue in the vicinity of yellow can be encoded less precisely (Fig. 2).

したがって、黄色付近の青色の変化をあまり正確にエンコードすることはできません(図2)。

YUV color spaces are defined as linear transformations of gamma-compressed RGB and thus are not powerful enough to model such phenomena.

YUV色空間はガンマ圧縮されたRGBの線形変換として定義されているため、そのような現象をモデル化するのには十分強力ではありません。

Second, the human eye has lower spatial resolution in blue than in red and green, and has next to no blue receptors in the high-resolution area of the retina.

第二に、人間の眼は、赤色および緑色よりも青色の空間分解能が低く、網膜の高解像度領域に青色受容体が殆どありません。

Thus, high frequency changes in blue can be encoded less precisely.

従って、青色の高周波変化は、あまり正確には符号化され得ません。

Third, the visibility of fine structure in the image depends on the amount of visual activity in the vicinity.

第3に、画像における微細構造の可視性は、近傍の視覚的活動の量に依存する。

Thus, we can encode areas with large amount of visual noise less precisely (see example in Fig. 3).

したがって、視覚的ノイズの多い領域をあまり正確にエンコードすることはできません(図3の例を参照)。

In Guetzli we model all these aspects in a way that leads to homogeneous loss in the image.

Guetzliでは、イメージの均質な損失をもたらすような方法でこれらのすべての側面をモデル化します。

We achieve this by guiding the encoder with Butteraugli, our psychovisual metric.

私たちは、私たちの心理視覚的測定基準であるButteraugliでエンコーダを導く事でこれを実現します。

f:id:yoya:20170320131737j:image

Figure 3: Landscape photo on the top with its visual mask shown on the bottom. Darker areas on the visual mask require less precise reproduction of details. Visual masking allows areas of the photograph to be stored at different accuracy, up to 6× quantization difference for this image.

図3:視野マスクが下に表示された上の風景写真。視覚マスク上のより暗い領域は、細部の再現があまり正確ではない。視覚マスキングは、写真の領域を異なる精度で、この画像の最大6倍の量子化差まで保存することを可能にする。

According to this visual masking model, the sky needs to be compressed with less loss than the tree, lake and the buildings for a uniform experience of compression quality.

この視覚マスキングモデルによれば、圧縮品質の均一な経験のために、木、湖、建物よりも少ない損失で空を圧縮する必要があります。

Guetzli computes two separate masking models – one for low spatial frequency color modeling and one for high spatial frequency color modeling.

Guetzliは、低空間周波数カラーモデリング用と高空間周波数カラーモデリング用の2つの別々のマスキングモデルを計算します。

Both models contain one mask for each dimension of the color space. The mask above is the high spatial frequency intensity mask.

両方のモデルは、色空間の各次元ごとに1つのマスクを含みます。上記のマスクは高空間周波数強度マスクです。

f:id:yoya:20170320131738j:image

Figure 4: On the left hand, the landscape image on the top left hand corner is decomposed into three YUV planes in a JPEG. Every 8 × 8 square is transformed into DCT space, and the DCT values are quantized. In addition to quantizing, Guetzli zeroes out small values aggressively.

図4:左手では、左上隅の風景画像がJPEGの 3つのYUV平面に分解されます。8×8の各正方形がDCT空間に変換され、DCT値が量子化される。量子化に加えて、Guetzliは小さな値を積極的にゼロにします。

In this document we describe the optimization approaches we use and ones we have rejected, the iterative framework in which we apply those approaches, show the results in comparison to other JPEG encoders, and finally discuss their significance and further opportunities in image compression.

このドキュメントでは、使用する最適化手法と拒否した手法、それらのアプローチを適用する反復フレームワーク、他のJPEGエンコーダとの比較結果を示し、最終的に画像圧縮の重要性とさらなる機会について説明します。

2 Methods

JPEG encoding consists of converting an image to YUV colorspace, breaking it up into blocks, transforming each block into frequency domain using DCT, quantizing the resulting coefficients and compressing them losslessly (Fig. 4).

JPEGエンコーディングは、画像をYUV色空間に変換し、ブロックに分解し、DCTを使用して各ブロックを周波数領域に変換し、得られた係数を量子化し、それらを無損失で圧縮することからなります。(図4)。

Guetzli looks for possibilities to reduce the size of the compressed representation without degrading the perceived visual quality.

Guetzliは、知覚される視覚的品質を低下させることなく圧縮表現のサイズを縮小する可能性を模索します。

This section describes the methods used to achieve that.

このセクションでは、これを達成するために使用される方法について説明します。

2.1 Optimization opportunities

Guetzli produces a compliant JPEG le, so the optimizations that can be performed are limited strictly to the options available in this data format, and even further limited to those that practical implementations support.

Guetzliは互換性のあるJPEG ファイルを生成するので、実行できる最適化はこのデータ形式で使用できるオプションに厳密に限定され、実際の実装でサポートされているオプションにさらに制限されます。

We use three options provided by the format: we tune the global quantization tables, replace some DCT coecients with zeroes and decide on using a mode in which chroma channels are downsampled (YUV420).

グローバル量子化テーブルを調整し、いくつかのDCT 係数をゼロに置き換え、クロマチャネルがダウンサンプリングされるモード(YUV420)を使用するかどうかを決める3つのオプションを使用します。

We have decided not to use other options, either because we found them not to be bene cial, or because they cause other undesirable e ects.

他のオプションを使用しないことを決定しました。なぜなら、それらが有益でないことが判明したか、または他の望ましくない影響を引き起こすからです。

The fi rst optimization opportunity we make use of is changing the (global) quantization tables to make the quantization coarser, which decreases the size of the image (by decreasing the magnitude of stored coecients).

我々が使用する最初の最適化の機会は、(グローバルな)量子化テーブルを変更して量子化を粗くすることであり、保存された係数の大きさを減らすことによって画像のサイズが減少します。

This is similar to adjusting the quality parameter in a traditional JPEG encoder and causes distortions in the whole image.

これは、従来のJPEGエンコーダの品質パラメータを調整することと似ており、画像全体に歪みが生じます。

The second opportunity involves direct modi cation of the coecients.

2番目の機会には、係数の直接変更が含まれます。

We replace some of the DCT coecient values in each block with zeros.

各ブロックのDCT 係数値の一部をゼロで置き換えます。

This modi cation distorts the visual appearance of the block in question.

この変更は問題のブロックの視覚的外観を歪ませます。

Zeros are RLE-encoded, so encoding a zero that occurs next to another zero costs virtually nothing.

ゼロはRLEでエンコードされているため、別のゼロの隣にあるゼロをエンコードすることはほとんど必要ありません。

Thus, replacing a coecient with a zero, when there is a neighbouring zero, reduces the encoded size by the size of that coecient.

したがって、係数をゼロで置き換えると、隣接するゼロがある場合、その係数のサイズだけ符号化されたサイズが縮小されます。

Even if there is no neighbouring zero, encoding of a zero is virtually always shorter than of a non-zero value.

隣接するゼロが存在しない場合でも、ゼロの符号化は実質的に常にゼロ以外の値より短いです。

Lastly, we consider an encoding in YUV420 mode, where two out of three channels are downsampled by 2x2. Unfortunately, YUV420's handling of an area of the image does not depend on the colors involved, and so it cannot capture e ects such as the one in Fig. 2 (see Fig. 5 for the distortion that Guetzli applies to that image, which still cannot be seen).

最後に、YUV420モードでのエンコーディングを検討します。ここでは、3つのうち2つが2x2でダウンサンプリングされます。残念なことに、YUV420の画像領域の取り扱いは、関係する色に依存しないため、図3のような効果を捕らえることはできません。2(Guetzliがその画像に適用する歪みについては図5を参照してください。まだ見えません)。

In many cases encoding an image in YUV420 mode, with no quantization, already causes a visible distortion. Thus, YUV420 is rarely useful in the quality range Guetzli targets.

多くの場合、量子化なしでYUV420モードで画像を符号化すると、すでに目に見える歪みが生じます。したがって、YUV420は Guetzli の品質範囲ではほとんど役に立ちません。

We have also tried to get space savings by decreasing (but not zeroing out) absolute values of some coecients.

我々はまた、いくつかの係数の絶対値を減少させることによって(しかしゼロにしないで)空間節約を試みた。

We hoped that by doing that we can decrease the size of a coefficient at a lower cost to the image quality.

これを行うことで、画質よりも低コストで係数のサイズを小さくすることができることを期待しました。

However, we could not nd a way to bene cially combine it with zeroing out of the coecients.

しかし、我々は、それを係数のゼロと結びつける方法を見つけることはできませんでした。

We have also tried to modify the coecients to compensate for distortions caused by previously-mentioned optimizations.

我々はまた、前述の最適化によって引き起こされた歪みを補償するために係数を修正しようと試みました。

In order to nd the compen- sating modi cations, we've computed the derivative of an approximation of Butteraugli. Unfortunately, such modi cations are usually smaller than quantization intervals, so they cannot be applied.

補正の仕方を調べるために、Butteraugliの近似値の導関数を計算しました。残念なことに、このような変更は通常、量子化間隔よりも小さいため適用できません。

We chose to forego some options due to undesired e ects they would have.

私たちは、望ましくない影響のためにいくつかの選択肢を避けることを選択しました。

We have chosen not to resample the image to a lower resolution.

画像を低い解像度に再サンプリングしないことを選択しました。

Using a lower spatial resolution is often a practical approach [4], but we left it out from

より低い空間解像度を使用することはしばしば実用的なアプローチです[4]。しかし、我々はそれを

f:id:yoya:20170321205923j:image

Figure 5: The top part of the gure shows how imagemagick convert --subsample-factor 1x1x1 stores the blue channel of the image in Figure 2.

図5:図の上部には、imagemagick convert --subsample-factor 1x1x1が図2の画像の青色チャネルをどのように格納するかが示されています。

One can observe that the blue channel, which is displayed here as a grayscale image, is stored with similar accuracy in the black area and in the yellow area.

ここではグレースケール画像として表示される青色チャネルは、黒色領域および黄色領域に同様の精度で格納されていることが分かります。

The bottom part of the gure shows how Guetzli stores the blue channel of the image in Figure 2.

図2に、Guetzliがイメージの青いチャネルをどのように格納しているかが示されています。

Guetzli compromises the quality of low blue values more when the blue perception is masked by yellow, but stores it with higher accuracy when blue modulation is on the black background.

Guetzliは、青の知覚が黄色でマスクされているときに、青の値の低い方の品質を妥協しますが、青色変調が黒の背景にあるときは、高い精度で格納します。


f:id:yoya:20170321205924p:image

Figure 6: High-level overview of Guetzli operation.

図6:Guetzli操作の概要。

Guetzli first tunes global parameters and only then tunes local parameters, holding global parameters constant.

Guetzliはグローバルパラメータチューニングしてから、ローカルパラメータチューニングし、グローバルパラメータは一定に保ちます。

During the whole course of tuning, candidate JPEGs are generated and the best one of them is chosen as the final output.

チューニングの全過程で、候補JPEGファイルが生成され、それらの最良のものが最終出力として選択されます。

automated optimizations as we thought that it is somewhat orthogonal to the optimizations we do and can be implemented as a higher-level optimization.

自動化された最適化は、私たちが行う最適化とは幾分直交しており、より高いレベルの最適化として実装できると考えていました。

We have also decided to forego producing progressive JPEGs (we always produce sequential JPEGs).

私たちはまた、プログレッシブ JPEGを生成することを断念しました(私たちは常にシーケンシャルJPEGを生成します)。

Although progressive JPEGs are 2-5% smaller, they are 17-200% slower to decode [5].

progressive JPEG は、2-5% 小さくなりますが、デコードが17-200%遅くなります。[5]

2.2 Optimization procedure

Guetzli uses an iterative optimization process. In order to make the problem simpler, the optimizer is not guided by file size. Instead, it is driven by the perceptual quality target alone.

Guetzliは反復最適化プロセスを使用します。問題を簡単にするために、オプティマイザはファイルサイズではガイドされません。代わりに、それは知覚品質目標のみによって駆動されます。

It aims to create a JPEG encoding with perceptual distance below a given threshold, as close to the threshold as possible.

可能な限り閾値に近い、所定の閾値未満の知覚距離を有するJPEG符号化を生成することを目的とする。

Each iteration produces a candidate output JPEG and, at the end, the best (not necessarily the last) one of them is selected.

各繰り返しは候補出力JPEGを生成し、最後に最良の(必ずしも最後ではない)1つが選択される。

As mentioned previously, there are two adjustments we can make to the image: global ones (quantization table) and local ones (replacing coeffcients with zeros).

先に述べたように、グローバルなもの(量子化テーブル)とローカルなもの(係数をゼロで置き換える)の2つの調整があります。

We make them in order (Fig. 6):

私たちはそれらを順番に作ります(図6):

We fi rst generate some number of proposals while tuning the global adjustments only. At the same time we decide on the fi nal set of global adjustments.

グローバル調整のみをチューニングしながら、いくつかの提案を最初に生成します。同時に、グローバル調整の最終セットを決定し ます。

Then, while using the final set of global adjustments, we generate more proposals while tuning the local adjustments.

グローバル調整の最終セットを使って、ローカル調整のチューニングをしてより多くの提案を生成します。

2.2.1 Global quantization table optimizations

Changes to the global quantization table impact the distortion of the whole image, usually in a different manner and with a different magnitude in different areas. A global quantization table is an array of 192 values.

グローバル量子化テーブルの変更は、通常は異なる方法で、異なる領域で異なる大きさで、画像全体の歪みに影響を与えます。グローバル量子化テーブルは、192個の値の配列です。

It is infeasible to perform anything that approximates an exhaustive search of that space.

その空間の徹底的な探索に近似する何かを実行することは実行不可能である。

Instead, we have selected a set of prede ned quantization tables and we use tables from that set only.

代わりに、事前定義された量子化テーブルのセットを選択し、そのセットのテーブルのみを使用します。

We try to nd a quantization table in that set that will produce psychovi-sual distance not larger than α < 1 times the desired maximal distance, when no other distortions are applied.

我々は、他の歪みが適用されていないときに、所望の最大距離のα<1倍以下の心理的距離を生成する量子化テーブルをそのセット内に見つけることを試みます。

The multiplication factor α was chosen experimentally to be 0:97, because this value yielded the smallest possible fi nal output images.

乗算係数αは実験的に0:97に選択されました。これは、この値が最終的に可能な限り小さな 最終出力画像を生成したためです。

This small amount of slack allows for local optimizations to be done everywhere in the image.

このわずかな緩み(あそび)は、画像内のどこでもローカル最適化を行うことを可能にします。

2.2.2 Replacing individual coefficients with zeros

The JPEG format is extremely coefficient in coding zero DCT coefficients, as it has a joint-entropy RLE approach to coding zeros together with DCT value pre fixes.

JPEGフォーマットは、DCT値の事前修正とともにゼロを符号化するためのジョイントエントロピーRLEアプローチを有するので、ゼロDCT係数は符号化する際の特殊な係数です。

At the same time cost savings achievable by any other coefficient modi cation are much smaller. In practice, the more zeros we have, the smaller the resulting JPEG.

同時に、他の係数変更によって達成可能なコスト削減は、はるかに小さくなります。実際には、零点が増えるほど、得られるJPEGは小さくなります。

Because of this, much of Guetzli's power depends on choosing the correct coecients to zero out.

このため、Guetzli's のパワーの大部分は、正しい係数をゼロにすることに依存します。

The choice of coefficients to zero out in far away blocks is essentially independent.

遠く離れたブロックでゼロになる係数の選択は、本質的に独立しています。

However, the choice in nearby blocks has to be coordinated for two distinct reasons. Most obviously, the choices in both blocks that share an edge impact artifacts on that edge.

しかし、2つの異なる理由から、近くのブロックの選択を調整する必要があります。最も明らかに、エッジを共有する両方のブロックの選択肢が、そのエッジにアーチファクトに影響を与えます。

In some cases it appears that introducing distortion on both sides of the edge causes the distortion to be less visible than if one of the blocks was unchanged.

場合によっては、エッジの両側に歪みを導入すると、ブロックの1つが変化していない場合よりも歪みが目立たないように見える。

Secondly, the visual impact of many small artifacts in the same vicinity is additive.

第2に、同じ近傍の多くの小さなアーティファクトの視覚的影響は加算の関係にあります。

In order to take these dependencies into account, we adjust the zeroing- out choice in all blocks simultaneously.

これらの依存関係を考慮に入れて、すべてのブロックでゼロ設定を同時に調整します。

Similarly to the global optimization phase, after each such adjustment we produce a candidate output image.

グローバル最適化フェーズと同様に、このような各調整の後、我々は候補出力画像を生成します。

We then compute the psychovisual distance between the original and candidate image and use it to decide on the next adjustment.

次に、原画像と候補画像との間の心理的距離を計算し、それを用いて次の調整を決定します。

Thus the feedback loop, which uses a block-agnostic distance metric, provides the required coordination across nearby blocks.

したがって、ブロックに依存しない距離メトリックを使用するフィードバックループは、近くのブロックにわたって必要な調整を提供します。

In order to simplify the adjustments, we rst determine the relative importance of coecients in each block.

調整を簡単にするために、最初に各ブロックの係数の相対的重要性を決定します。

This is done using a Butteraugli- derived heuristic.

これは、Butteraugli由来のヒューリスティックを使用して行われます。

We then zero out some number of the least important coefficients in each block, according to our importance estimation.

私たちは重要度の推定に基づいて、各ブロックで最も重要でない係数をいくつかゼロにします。

Before producing each subsequent candidate, we simply adjust the number of coefficients zeroed out so that the psychovisual error is below the threshold, as close as possible to the threshold, everywhere.

後続の各候補を生成する前に、心理的エラーが閾値以下になるように、係数の数をゼロに調整するだけで、どこでも可能な限りしきい値に近づけます。

The zeroing out is by far the most powerful part of Guetzli.

ゼロ調整は、Guetzli の最も強力な部分です。

The reduction in size gained by using global and local optimization over just using local optimization (with some reasonable defaults for quantization tables) is only about 10%.

ローカル最適化を使用するだけでグローバルおよびローカル最適化を使用することによって得られるサイズの縮小(量子化テーブルのいくつかの合理的デフォルトを使用)は、わずか約10%です。

3 Results

We evaluate the Guetzli compressor and compare its performance at the same psychovisual distortion measured by Butteraugli. Butteraugli is the metric Guetzli optimizes for.

Guetzli コンプレッサーを評価し、Butteraugli が測定したのと同じ心理的歪みでその性能を比較します。Butteraugli は Guetzli が最適化する指標です。

Thus, this experiment tests Guetzli's optimization abilities and, in itself, does not measure visual quality of the results.

したがって、この実験は Guetzli の最適化能力をテストし、それ自体は結果の視覚的品質を測定しません。

We will separately publish results of a human rating study that does compare visual quality, as perceived by humans.

我々は、人間が知覚するように、視覚的な品質を比較する人間の評価研究の結果を別に公表する。

Our image corpus ([6]) has been created by taking photos with a Canon EOS 600d camera, storing them using highest quality JPEG settings and downsampling the resulting images by 4 x 4 using Lanczos resampling, as implemented in GIMP.

当社の画像コーパス([6])は、Canon EOS 600dカメラで写真を撮影し、最高品質のJPEG設定を使用してそれらを保存し、GIMPで実装されているLanczosリサンプリングを使用して4 x 4でダウンサンプリングします。

Some of the images had unsharp masking applied to them before the 4 x 4 resampling.

4×4リサンプリングの前に、画像の一部にアンシャープマスキング適用されていました。

We have compared Guetzli to libjpeg and mozjpeg.

Guetzliとlibjpeg、mozjpegを比較しました

We ran libjpeg and mozjpeg at quality 95, both with and without chroma downsampling.

クロマダウンサンプリングの有無にかかわらず、libjpegとmozjpegを品質95で実行しました。

Additionally, for mozjpeg we have tried three values of the tune parameter (hvs-psnr, ssim and ms-ssim).

さらに、mozjpegではチューンパラメータ(hvs- psnrssimms - ssim)の3つの値を試しました。

The procedure we used to generate the results is detailed in Algorithm 1.

結果を生成するために使用した手順は、アルゴリズム1で詳しく説明しています。

The script used to implement that procedure can be found at https://goo.gl/jON2lC.

この手順を実行するために使用されるスクリプトは、https://goo.gl/jON2lC にあります。

The results are summarized in Table 1.

結果を表1に要約します。

When comparing Guetzli to another compression algorithm at the same Butteraugli score, we can reach savings in size between of 29-45% savings in fi le size.

同じButteraugliスコアで別の圧縮アルゴリズムにGuetzliを比較すると、我々はファイルサイズの29-45%を節約の達成出来ました。

f:id:yoya:20170321215308p:image

4 Discussion

The JPEG format does not support spatially adaptive quantization -- the quantization arrays are constant across the whole image.

JPEGのフォーマットは、空間的に適応量子化をサポートしていません-量子化アレイは、画像全体にわたって一定です。

However, one can simulate this by creating more zeroes in areas with intended coarser quantization.

しかしながら、意図されたより粗い量子化を有する領域において、より多くのゼロを生成することによってこれをシミュレートすることができます。

Using this poor substitute for adaptiveness, we can get partial benefi t out of exploiting visual masking phenomena (Fig. 4).

この貧弱な適応の代わりに、視覚的なマスキング現象を利用して部分的な利益を得ることができます(図4)。

We also use it to approximate nonuniform quantization in sRGB space.

また、sRGB空間における非一様量子化の近似にも使用します。

Format-level support for spatially adaptive quantization and di erent colorspaces and/or value-based adaptive quantization would make these optimizations much simpler and more powerful.

空間的に適応する量子化と異なる色空間および/または値ベースの適応量子化に対するフォーマットレベルのサポートにより、これらの最適化ははるかに簡単で強力になります。

It can be interesting to note that the effect in Fig. 3 is not captured in the JPEG format.

図2の効果が興味深いです。 3はJPEG形式ではキャプチャされません。

The colorspace conversion from RGB to YUV is linear, and cannot reduce accuracy of blue in a certain color mixtures.

色空間変換RGB YUVには、線形、および特定の色の混合物で青の精度を低下させることはできません。

Similarly, the change between YUV444 and YUV420 does not make a di erence in the representation accuracy of blue in di erent color environments { the spatial reduction happens similarly in black and yellow backgrounds.

様に、YUV444とYUV420の間の変化は、異なる色環境での青の表現精度において差異を生じさせられません。(空間的縮小は黒と黄色の背景で同様に起こる)。

This partially explains why YUV420 artifacts can be easily observable in images with color details and dark backgrounds.

これは、YUV420のアーティファクトが、色の細部と暗い背景を持つ画像で容易に観察できる理由を部分的に説明しています。

The results presented in this paper do not provide direct evidence of perceived visual quality of results.

この論文で提示された結果は、結果の視覚的品質の知覚の直接的な証拠を提供していません。

We will separately publish results of a human rating study designed to provide such evidence.

私たちは、そのような証拠を提供するように設計されたヒューマンレーティング・スタディの結果を別に公表します。

Some of our results are apples to oranges comparison as we compare progressive JPEGs (mozjpeg) against sequential JPEGs (Guetzli).

我々の結果のいくつかは、プログレッシブ JPEG(mozjpeg)とシーケンシャルJPEG(Guetzli)を比較する際に、リンゴとオレンジの比較です。

This puts Guetzli at a disadvantage, but in a Butteraugli-based measurement we still get overall savings for Guetzli (􀀀29:95%).

これは Guetzli には不利な立場ですが、Butteraugli をベースにした測定では、Guetzli の全体的な節約額(29%:95%)が得られます。

It is questionable whether the savings at transfer time are worth the slowdown at decoding time.

転送時の節約がデコード時の減速の価値があるのは疑問です。

We did not make an attempt at progressive encoding with Guetzli, so we cannot be sure how much smaller such images would be, but very likely we would get signi cant further size savings from progressive encoding.

Guetzliでプログレッシブエンコーディングを試みたわけではありませんでした。そのようなイメージはどれくらい小さくなるのかはわかりませんが、プログレッシブエンコーディングでさらにサイズを節約できる可能性は非常に高いです。

As with zopfli [7], our similar effort for the gzip/deate/PNG format,

zopfli [7](gzip / deate / PNG形式の私たちの同様の努力)のように、

Guetzli is rather slow to encode. Getting a signi cant savings on static image content on popular image heavy websites can be a possible actual use case.

Guetzliはエンコードするのがむしろ遅いです。一般的なイメージの重いウェブサイトで静的なイメージコンテンツを大幅に節約することはが実際のユースケースとして可能性があります。

Although Guetzli may be too slow for many practical uses, we hope that it can show direction for future image format design.

Guetzliは多くの実用には遅すぎるかもしれませんが、将来のイメージフォーマット設計の方向性を示すことができることを願っています。

We have shown that even despite the de ciencies of the JPEG format, we can still greatly bene t from a complex psychovisual score such as Butteraugli, and the approach we have chosen produces signi cantly smaller (29-45%) file sizes at a given psychovisual error score.

私たちは、JPEG形式の魅力にもかかわらず、Butteraugliのような複雑な心理観のスコアから大きく利益を得ることができることを示しました。

私たちが選択したアプローチは、特定の心理的エラースコアで、ファイルサイズが大幅に小さくなります。(29-45%)

The same approach can be applied to a format that lacks these de ciencies (e.g. allows spatial adaptive quantization, admits a richer description of quantization that can capture the e ect from Fig. 3) at a much smaller computational cost and, likely, signi cantly larger compression ratio bene t.

同様のアプローチは、これらの欠点を持たないフォーマット(例えば、空間適応量子化を可能にし、図3からの効果を捕らえることができる量子化のより豊富な記述を可能にする )に、はるかに小さい計算コストで、大幅に圧縮率が高くなります。

References

[1] Jyrki Alakuijala et al. Butteraugli, 2016. URL https://github.com/google/ butteraugli.

[2] The HTTP Archive. HTTP archive - interesting stats, 2016. URL http://httparchive.org/interesting.php?a=All&l=Dec%202%202016.

[3] Robert Obryk, Zoltan Szabadka, et al. Guetzli, 2017. URL https://github.com/google/guetzli.

[4] Yaniv Romano, John Isidoro, and Peyman Milanfar. RAISR: Rapid and accurate image super resolution. IEEE Transactions on Computational Imaging, 2016.

[5] The libjpeg-turbo Project. What about mozjpeg?, 2014. URL http://www.libjpeg-turbo.org/About/Mozjpeg.

[6] Jyrki Alakuijala. Image corpus for evaluating Guetzli, 2017. URL https://goo.gl/cmHIkl.

[7] Jyrki Alakuijala, Lode Vandevenne, et al. Zop i compression algorithm, 2016. URL https://github.com/google/zopfli.

2017/03/19(Sun) ImageMagick-6.9.8-2差分

[]ImageMagick-6.9.8-2差分

ImageMagick-6.9.8-1差分 - yoyaのメモの続き

The latest release of ImageMagick is version 6.9.8-2

  • 7 系同時リリースはなし

まとめ

差分

0a1,3
> 2017-03-18  6.9.8-2 Cristy  <quetzlzacatenango@image...>
>   * Release ImageMagick version 6.9.7-2, GIT revision 11436:a912791:20170318.
ChangeLogにない差分
69c69
<   WritePGXImage(const ImageInfo *,Image *,ExceptionInfo *);
---
>   WritePGXImage(const ImageInfo *,Image *);
315c315
< %        Image *image,ExceptionInfo *exception)
---
> %        Image *image)
323,324d322
< %    o exception: return any errors or warnings in this structure.
< %
326,327c324
< static MagickBooleanType WritePGXImage(const ImageInfo *image_info,Image *image,
<   ExceptionInfo *exception)
---
> static MagickBooleanType WritePGXImage(const ImageInfo *image_info,Image *image)
331a329,331
>   ExceptionInfo
>     *exception;
>
359a360
>   exception=(&image->exception);

ChangeLog

2017-03-18  6.9.8-2 Cristy  <quetzlzacatenango@image...>
  * Release ImageMagick version 6.9.7-2, GIT revision 11436:a912791:20170318.

2017-03-14  6.9.8-1 Cristy  <quetzlzacatenango@image...>
  * Support namespaces for the security policy.

2017/03/18(Sat) ImageMagick-6.9.8-1差分

[]ImageMagick-6.9.8-1差分

ImageMagick-6.9.8-0差分 - yoyaのメモの続き

The latest release of ImageMagick is version 6.9.8-1

まとめ

  • security policy の namespace をサポート

コードを見る限り、domain="foo" name="baa" を name="foo:baa" とかけるようだけど。ちょっと意味がわからない。

差分

  • security policy の namespace をサポート
    • magick/policy.c
262c262,265
<     policyname[MaxTextExtent];
---
>     policyname[MagickPathExtent];
>
>   PolicyDomain
>     domain;
278c281
<     (void) CopyMagickString(policyname,name,MaxTextExtent);
---
>     (void) CopyMagickString(policyname,name,MagickPathExtent);
283c286
<     (void) CopyMagickString(q,q+1,MaxTextExtent);
---
>     (void) CopyMagickString(q,q+1,MagickPathExtent);
286a290,303
>     Strip domain from policy name (e.g. resource:map).
>   */
>   domain=UndefinedPolicyDomain;
>   for (q=policyname; *q != '\0'; q++)
>   {
>     if (*q != ':')
>       continue;
>     *q='\0';
>     domain=(PolicyDomain) ParseCommandOption(MagickPolicyDomainOptions,
>       MagickTrue,policyname);
>     (void) CopyMagickString(policyname,q+1,MagickPathExtent);
>     break;
>   }
>   /*
298a316
>     if ((domain == UndefinedPolicyDomain) || (p->domain == domain))
599c617,618
<           authorized=(p->rights & ReadPolicyRights) != 0;
---
>           authorized=(p->rights & ReadPolicyRights) != 0 ? MagickTrue :
>             MagickFalse;
601c620,621
<           authorized=(p->rights & WritePolicyRights) != 0;
---
>           authorized=(p->rights & WritePolicyRights) != 0 ? MagickTrue :
>             MagickFalse;
603c623,624
<           authorized=(p->rights & ExecutePolicyRights) != 0;
---
>           authorized=(p->rights & ExecutePolicyRights) != 0 ? MagickTrue :
>             MagickFalse;
    • magick/distribute-cache.c
206c206
<   shared_secret=GetPolicyValue("shared-secret");
---
>   shared_secret=GetPolicyValue("cache:shared-secret");
801c801
<   shared_secret=GetPolicyValue("shared-secret");
---
>   shared_secret=GetPolicyValue("cache:shared-secret");
    • magick/magick.c
1549c1549
<         limit=GetPolicyValue("precision");
---
>         limit=GetPolicyValue("system:precision");
    • magick/resource.c
438c438
<   value=GetPolicyValue("temporary-path");
---
>   value=GetPolicyValue("resource:temporary-path");
1296c1296
<       value=GetPolicyValue("width");
---
>       value=GetPolicyValue("resource:width");
1305c1305
<       value=GetPolicyValue("height");
---
>       value=GetPolicyValue("resource:height");
1314c1314
<       value=GetPolicyValue("area");
---
>       value=GetPolicyValue("resource:area");
1322c1322
<       value=GetPolicyValue("memory");
---
>       value=GetPolicyValue("resource:memory");
1331c1331
<       value=GetPolicyValue("map");
---
>       value=GetPolicyValue("resource:map");
1339c1339
<       value=GetPolicyValue("disk");
---
>       value=GetPolicyValue("resource:disk");
1347c1347
<       value=GetPolicyValue("file");
---
>       value=GetPolicyValue("resource:file");
1355c1355
<       value=GetPolicyValue("thread");
---
>       value=GetPolicyValue("resource:thread");
1369c1369
<       value=GetPolicyValue("throttle");
---
>       value=GetPolicyValue("resource:throttle");
1378c1378
<       value=GetPolicyValue("time");
---
>       value=GetPolicyValue("resource:time");
1380c1380
<         resource_info.time_limit=MagickMax(limit,StringToSizeType(value,100.0));
---
>         resource_info.time_limit=MagickMin(limit,StringToSizeType(value,100.0));
    • magick/utility.c
1810c1810
<   passes=GetPolicyValue("shred");
---
>   passes=GetPolicyValue("system:shred");
ChangeLogにない差分
  • PerlMagick/quantum/quantum.xs
    • info->image_info->filename 参照前に NULL チェック
    • attribute channel がないと alpha なしで処理してたので、修正
4868,4870d4867
<               if (info && info->image_info->filename &&
<                   *info->image_info->filename)
<                 s=newSVpv(info->image_info->filename,0);
4872a4870,4872
>               else
>                 if (info && *info->image_info->filename)
>                   s=newSVpv(info->image_info->filename,0);
PerlMagick/quantum/quantum.xs.in
4868,4870d4867
<               if (info && info->image_info->filename &&
<                   *info->image_info->filename)
<                 s=newSVpv(info->image_info->filename,0);
4872a4870,4872
>               else
>                 if (info && *info->image_info->filename)
>                   s=newSVpv(info->image_info->filename,0);
13701a13702,13703
>     if (image->matte != MagickFalse)
>       channel|=OpacityChannel;
  • coders/jp2.c
    • ssize_t を size_t に。
820,821c820,821
<     if (((ssize_t) (1 << (i+2)) > image->columns) &&
<         ((ssize_t) (1 << (i+2)) > image->rows))
---
>     if (((size_t) (1 << (i+2)) > image->columns) &&
>         ((size_t) (1 << (i+2)) > image->rows))
  • coders/pgx.c
    • 書き込みに失敗した時点で中断させる
380c380
      count=WriteBlob(image,length,pixels);
      if (count != (ssize_t) length)
<       ThrowWriterException(CorruptImageError,"UnableToWriteImageData");
---
>       break;
  • coders/png.c
    • 数値の型合わせ
1864c1864
<       for (i=0; i<chunk->size; i++)
---
>       for (i=0; i < (ssize_t) chunk->size; i++)
  • tiff.c
    • size_t キャスト
1617c1617
<       TIFFScanlineSize(tiff),(size_t) (image->columns*samples_per_pixel*
---
>       TIFFScanlineSize(tiff),(image->columns*samples_per_pixel*
||M<
- magick/cache.c
--  MAGICK_SYNCHRONIZE を cache_info-syncronize に収納した
>|c|
338c338
<     *synchronize;
---
>     *value;
360,361c360,367
<   synchronize=GetEnvironmentValue("MAGICK_SYNCHRONIZE");
<   if (synchronize != (const char *) NULL)
---
>   value=GetEnvironmentValue("MAGICK_SYNCHRONIZE");
>   if (value != (const char *) NULL)
>     {
>       cache_info->synchronize=IsStringTrue(value);
>       value=DestroyString(value);
>     }
>   value=GetPolicyValue("cache:synchronize");
>   if (value != (const char *) NULL)
363,364c369,370
<       cache_info->synchronize=IsStringTrue(synchronize);
<       synchronize=DestroyString(synchronize);
---
>       cache_info->synchronize=IsStringTrue(value);
>       value=DestroyString(value);
3834a3841,3842
>       if (value == (char *) NULL)
>         value=GetPolicyValue("cache:memory-map");
  • magick/compare.c
<   if (((channel & OpacityChannel) != 0) && ((image->matte != MagickFalse) ||
<       (reconstruct_image->matte != MagickFalse)))
<     distortion[CompositeChannels]/=(double)
<       (GetNumberChannels(image,channel)-1);
<   else
  • identify.c
    • PrintChannelStatistics 第3引数で指定する文字列に "Overall" 追加。
    • (AlphaChannel に巻き込ませてる。QuantumRange から引いて逆数をとってるけど何だろう?)
458c458
<   if (channel == AlphaChannel)
---
>   if ((channel == AlphaChannel) || (LocaleCompare(name,"Overall") == 0))
  • magick/property.c
    • namespace を xmp_namespace に改名。(security policy namespace とごっちゃにならないよう?)
1743c1743
<             *namespace;
---
>             *xmp_namespace;
1750,1751c1750,1751
<               namespace=ConstantString(GetXMLTreeTag(node));
<               (void) SubstituteString(&namespace,"exif:","xmp:");
---
>               xmp_namespace=ConstantString(GetXMLTreeTag(node));
>               (void) SubstituteString(&xmp_namespace,"exif:","xmp:");
1753c1753
<                 namespace,ConstantString(content));
---
>                 xmp_namespace,ConstantString(content));
1760,1761c1760,1761
<                 namespace=ConstantString(GetXMLTreeTag(node));
<                 (void) SubstituteString(&namespace,"exif:","xmp:");
---
>                 xmp_namespace=ConstantString(GetXMLTreeTag(node));
>                 (void) SubstituteString(&xmp_namespace,"exif:","xmp:");
1763c1763
<                   namespace,ConstantString(content));
---
>                   xmp_namespace,ConstantString(content));
  • magick/statistic.c
1537,1539c1536
<         channel_statistics[RedChannel].variance-
<         channel_statistics[RedChannel].mean*
<         channel_statistics[RedChannel].mean;
---
>         channel_statistics[RedChannel].standard_deviation;

ChangeLog

2017-03-14  6.9.8-1 Cristy  <quetzlzacatenango@image...>
  * Support namespaces for the security policy.