github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/image/image.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package image implements a basic 2-D image library.
     6  //
     7  // The fundamental interface is called [Image]. An [Image] contains colors, which
     8  // are described in the image/color package.
     9  //
    10  // Values of the [Image] interface are created either by calling functions such
    11  // as [NewRGBA] and [NewPaletted], or by calling [Decode] on an [io.Reader] containing
    12  // image data in a format such as GIF, JPEG or PNG. Decoding any particular
    13  // image format requires the prior registration of a decoder function.
    14  // Registration is typically automatic as a side effect of initializing that
    15  // format's package so that, to decode a PNG image, it suffices to have
    16  //
    17  //	import _ "image/png"
    18  //
    19  // in a program's main package. The _ means to import a package purely for its
    20  // initialization side effects.
    21  //
    22  // See "The Go image package" for more details:
    23  // https://golang.org/doc/articles/image_package.html
    24  //
    25  // # Security Considerations
    26  //
    27  // The image package can be used to parse arbitrarily large images, which can
    28  // cause resource exhaustion on machines which do not have enough memory to
    29  // store them. When operating on arbitrary images, [DecodeConfig] should be called
    30  // before [Decode], so that the program can decide whether the image, as defined
    31  // in the returned header, can be safely decoded with the available resources. A
    32  // call to [Decode] which produces an extremely large image, as defined in the
    33  // header returned by [DecodeConfig], is not considered a security issue,
    34  // regardless of whether the image is itself malformed or not. A call to
    35  // [DecodeConfig] which returns a header which does not match the image returned
    36  // by [Decode] may be considered a security issue, and should be reported per the
    37  // [Go Security Policy](https://go.dev/security/policy).
    38  package image
    39  
    40  import (
    41  	"github.com/shogo82148/std/image/color"
    42  )
    43  
    44  // Configは、画像のカラーモデルと寸法を保持します。
    45  type Config struct {
    46  	ColorModel    color.Model
    47  	Width, Height int
    48  }
    49  
    50  // Imageは、カラーモデルから取得した [color.Color] 値の有限の長方形グリッドです。
    51  type Image interface {
    52  	ColorModel() color.Model
    53  
    54  	Bounds() Rectangle
    55  
    56  	At(x, y int) color.Color
    57  }
    58  
    59  // RGBA64Imageは、そのピクセルを直接color.RGBA64に変換できる [Image] です。
    60  type RGBA64Image interface {
    61  	RGBA64At(x, y int) color.RGBA64
    62  	Image
    63  }
    64  
    65  // PalettedImageは、色が限定的なパレットから来る可能性がある画像です。
    66  // もしmがPalettedImageで、m.ColorModel()が [color.Palette] pを返すなら、
    67  // m.At(x, y)はp[m.ColorIndexAt(x, y)]と等価であるべきです。もしmの
    68  // カラーモデルがcolor.Paletteでないなら、ColorIndexAtの振る舞いは
    69  // 定義されていません。
    70  type PalettedImage interface {
    71  	ColorIndexAt(x, y int) uint8
    72  	Image
    73  }
    74  
    75  // RGBAは、Atメソッドが [color.RGBA] 値を返すインメモリイメージです。
    76  type RGBA struct {
    77  	// Pixは、画像のピクセルをR, G, B, Aの順序で保持します。ピクセルは
    78  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4]で始まります。
    79  	Pix []uint8
    80  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
    81  	Stride int
    82  	// Rectは、画像の境界です。
    83  	Rect Rectangle
    84  }
    85  
    86  func (p *RGBA) ColorModel() color.Model
    87  
    88  func (p *RGBA) Bounds() Rectangle
    89  
    90  func (p *RGBA) At(x, y int) color.Color
    91  
    92  func (p *RGBA) RGBA64At(x, y int) color.RGBA64
    93  
    94  func (p *RGBA) RGBAAt(x, y int) color.RGBA
    95  
    96  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
    97  func (p *RGBA) PixOffset(x, y int) int
    98  
    99  func (p *RGBA) Set(x, y int, c color.Color)
   100  
   101  func (p *RGBA) SetRGBA64(x, y int, c color.RGBA64)
   102  
   103  func (p *RGBA) SetRGBA(x, y int, c color.RGBA)
   104  
   105  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   106  // 返される値は、元の画像とピクセルを共有します。
   107  func (p *RGBA) SubImage(r Rectangle) Image
   108  
   109  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   110  func (p *RGBA) Opaque() bool
   111  
   112  // NewRGBAは、指定された境界を持つ新しい [RGBA] イメージを返します。
   113  func NewRGBA(r Rectangle) *RGBA
   114  
   115  // RGBA64は、Atメソッドが [color.RGBA64] 値を返すインメモリイメージです。
   116  type RGBA64 struct {
   117  	// Pixは、画像のピクセルをR, G, B, Aの順序で、ビッグエンディアン形式で保持します。ピクセルは
   118  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8]で始まります。
   119  	Pix []uint8
   120  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   121  	Stride int
   122  	// Rectは、画像の境界です。
   123  	Rect Rectangle
   124  }
   125  
   126  func (p *RGBA64) ColorModel() color.Model
   127  
   128  func (p *RGBA64) Bounds() Rectangle
   129  
   130  func (p *RGBA64) At(x, y int) color.Color
   131  
   132  func (p *RGBA64) RGBA64At(x, y int) color.RGBA64
   133  
   134  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   135  func (p *RGBA64) PixOffset(x, y int) int
   136  
   137  func (p *RGBA64) Set(x, y int, c color.Color)
   138  
   139  func (p *RGBA64) SetRGBA64(x, y int, c color.RGBA64)
   140  
   141  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   142  // 返される値は、元の画像とピクセルを共有します。
   143  func (p *RGBA64) SubImage(r Rectangle) Image
   144  
   145  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   146  func (p *RGBA64) Opaque() bool
   147  
   148  // NewRGBA64は、指定された境界を持つ新しい [RGBA64] イメージを返します。
   149  func NewRGBA64(r Rectangle) *RGBA64
   150  
   151  // NRGBAは、Atメソッドが [color.NRGBA] 値を返すインメモリイメージです。
   152  type NRGBA struct {
   153  	// Pixは、画像のピクセルをR, G, B, Aの順序で保持します。ピクセルは
   154  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4]で始まります。
   155  	Pix []uint8
   156  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   157  	Stride int
   158  	// Rectは、画像の境界です。
   159  	Rect Rectangle
   160  }
   161  
   162  func (p *NRGBA) ColorModel() color.Model
   163  
   164  func (p *NRGBA) Bounds() Rectangle
   165  
   166  func (p *NRGBA) At(x, y int) color.Color
   167  
   168  func (p *NRGBA) RGBA64At(x, y int) color.RGBA64
   169  
   170  func (p *NRGBA) NRGBAAt(x, y int) color.NRGBA
   171  
   172  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   173  func (p *NRGBA) PixOffset(x, y int) int
   174  
   175  func (p *NRGBA) Set(x, y int, c color.Color)
   176  
   177  func (p *NRGBA) SetRGBA64(x, y int, c color.RGBA64)
   178  
   179  func (p *NRGBA) SetNRGBA(x, y int, c color.NRGBA)
   180  
   181  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   182  // 返される値は、元の画像とピクセルを共有します。
   183  func (p *NRGBA) SubImage(r Rectangle) Image
   184  
   185  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   186  func (p *NRGBA) Opaque() bool
   187  
   188  // NewNRGBAは、指定された境界を持つ新しい [NRGBA] イメージを返します。
   189  func NewNRGBA(r Rectangle) *NRGBA
   190  
   191  // NRGBA64は、Atメソッドが [color.NRGBA64] 値を返すインメモリイメージです。
   192  type NRGBA64 struct {
   193  	// Pixは、画像のピクセルをR, G, B, Aの順序で、ビッグエンディアン形式で保持します。ピクセルは
   194  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8]で始まります。
   195  	Pix []uint8
   196  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   197  	Stride int
   198  	// Rectは、画像の境界です。
   199  	Rect Rectangle
   200  }
   201  
   202  func (p *NRGBA64) ColorModel() color.Model
   203  
   204  func (p *NRGBA64) Bounds() Rectangle
   205  
   206  func (p *NRGBA64) At(x, y int) color.Color
   207  
   208  func (p *NRGBA64) RGBA64At(x, y int) color.RGBA64
   209  
   210  func (p *NRGBA64) NRGBA64At(x, y int) color.NRGBA64
   211  
   212  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   213  func (p *NRGBA64) PixOffset(x, y int) int
   214  
   215  func (p *NRGBA64) Set(x, y int, c color.Color)
   216  
   217  func (p *NRGBA64) SetRGBA64(x, y int, c color.RGBA64)
   218  
   219  func (p *NRGBA64) SetNRGBA64(x, y int, c color.NRGBA64)
   220  
   221  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   222  // 返される値は、元の画像とピクセルを共有します。
   223  func (p *NRGBA64) SubImage(r Rectangle) Image
   224  
   225  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   226  func (p *NRGBA64) Opaque() bool
   227  
   228  // NewNRGBA64は、指定された境界を持つ新しい [NRGBA64] イメージを返します。
   229  func NewNRGBA64(r Rectangle) *NRGBA64
   230  
   231  // Alphaは、Atメソッドが [color.Alpha] 値を返すインメモリイメージです。
   232  type Alpha struct {
   233  	// Pixは、画像のピクセルをアルファ値として保持します。ピクセルは
   234  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1]で始まります。
   235  	Pix []uint8
   236  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   237  	Stride int
   238  	// Rectは、画像の境界です。
   239  	Rect Rectangle
   240  }
   241  
   242  func (p *Alpha) ColorModel() color.Model
   243  
   244  func (p *Alpha) Bounds() Rectangle
   245  
   246  func (p *Alpha) At(x, y int) color.Color
   247  
   248  func (p *Alpha) RGBA64At(x, y int) color.RGBA64
   249  
   250  func (p *Alpha) AlphaAt(x, y int) color.Alpha
   251  
   252  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   253  func (p *Alpha) PixOffset(x, y int) int
   254  
   255  func (p *Alpha) Set(x, y int, c color.Color)
   256  
   257  func (p *Alpha) SetRGBA64(x, y int, c color.RGBA64)
   258  
   259  func (p *Alpha) SetAlpha(x, y int, c color.Alpha)
   260  
   261  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   262  // 返される値は、元の画像とピクセルを共有します。
   263  func (p *Alpha) SubImage(r Rectangle) Image
   264  
   265  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   266  func (p *Alpha) Opaque() bool
   267  
   268  // NewAlphaは、指定された境界を持つ新しい [Alpha] イメージを返します。
   269  func NewAlpha(r Rectangle) *Alpha
   270  
   271  // Alpha16は、Atメソッドが [color.Alpha16] 値を返すインメモリイメージです。
   272  type Alpha16 struct {
   273  	// Pixは、画像のピクセルをアルファ値として、ビッグエンディアン形式で保持します。ピクセルは
   274  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2]で始まります。
   275  	Pix []uint8
   276  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   277  	Stride int
   278  	// Rect is the image's bounds.
   279  	Rect Rectangle
   280  }
   281  
   282  func (p *Alpha16) ColorModel() color.Model
   283  
   284  func (p *Alpha16) Bounds() Rectangle
   285  
   286  func (p *Alpha16) At(x, y int) color.Color
   287  
   288  func (p *Alpha16) RGBA64At(x, y int) color.RGBA64
   289  
   290  func (p *Alpha16) Alpha16At(x, y int) color.Alpha16
   291  
   292  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   293  func (p *Alpha16) PixOffset(x, y int) int
   294  
   295  func (p *Alpha16) Set(x, y int, c color.Color)
   296  
   297  func (p *Alpha16) SetRGBA64(x, y int, c color.RGBA64)
   298  
   299  func (p *Alpha16) SetAlpha16(x, y int, c color.Alpha16)
   300  
   301  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   302  // 返される値は、元の画像とピクセルを共有します。
   303  func (p *Alpha16) SubImage(r Rectangle) Image
   304  
   305  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   306  func (p *Alpha16) Opaque() bool
   307  
   308  // NewAlpha16は、指定された境界を持つ新しい [Alpha16] イメージを返します。
   309  func NewAlpha16(r Rectangle) *Alpha16
   310  
   311  // Grayは、Atメソッドが [color.Gray] 値を返すインメモリイメージです。
   312  type Gray struct {
   313  	// Pixは、画像のピクセルをグレー値として保持します。ピクセルは
   314  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1]で始まります。
   315  	Pix []uint8
   316  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   317  	Stride int
   318  	// Rectは、画像の境界です。
   319  	Rect Rectangle
   320  }
   321  
   322  func (p *Gray) ColorModel() color.Model
   323  
   324  func (p *Gray) Bounds() Rectangle
   325  
   326  func (p *Gray) At(x, y int) color.Color
   327  
   328  func (p *Gray) RGBA64At(x, y int) color.RGBA64
   329  
   330  func (p *Gray) GrayAt(x, y int) color.Gray
   331  
   332  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   333  func (p *Gray) PixOffset(x, y int) int
   334  
   335  func (p *Gray) Set(x, y int, c color.Color)
   336  
   337  func (p *Gray) SetRGBA64(x, y int, c color.RGBA64)
   338  
   339  func (p *Gray) SetGray(x, y int, c color.Gray)
   340  
   341  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   342  // 返される値は、元の画像とピクセルを共有します。
   343  func (p *Gray) SubImage(r Rectangle) Image
   344  
   345  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   346  func (p *Gray) Opaque() bool
   347  
   348  // NewGrayは、指定された境界を持つ新しい [Gray] イメージを返します。
   349  func NewGray(r Rectangle) *Gray
   350  
   351  // Gray16は、Atメソッドが [color.Gray16] 値を返すインメモリイメージです。
   352  type Gray16 struct {
   353  	// Pixは、画像のピクセルをグレー値として、ビッグエンディアン形式で保持します。ピクセルは
   354  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2]で始まります。
   355  	Pix []uint8
   356  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   357  	Stride int
   358  	// Rectは、画像の境界です。
   359  	Rect Rectangle
   360  }
   361  
   362  func (p *Gray16) ColorModel() color.Model
   363  
   364  func (p *Gray16) Bounds() Rectangle
   365  
   366  func (p *Gray16) At(x, y int) color.Color
   367  
   368  func (p *Gray16) RGBA64At(x, y int) color.RGBA64
   369  
   370  func (p *Gray16) Gray16At(x, y int) color.Gray16
   371  
   372  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   373  func (p *Gray16) PixOffset(x, y int) int
   374  
   375  func (p *Gray16) Set(x, y int, c color.Color)
   376  
   377  func (p *Gray16) SetRGBA64(x, y int, c color.RGBA64)
   378  
   379  func (p *Gray16) SetGray16(x, y int, c color.Gray16)
   380  
   381  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   382  // 返される値は、元の画像とピクセルを共有します。
   383  func (p *Gray16) SubImage(r Rectangle) Image
   384  
   385  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   386  func (p *Gray16) Opaque() bool
   387  
   388  // NewGray16は、指定された境界を持つ新しい [Gray16] イメージを返します。
   389  func NewGray16(r Rectangle) *Gray16
   390  
   391  // CMYKは、Atメソッドが [color.CMYK] 値を返すインメモリイメージです。
   392  type CMYK struct {
   393  	// Pixは、画像のピクセルをC, M, Y, Kの順序で保持します。ピクセルは
   394  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4]で始まります。
   395  	Pix []uint8
   396  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   397  	Stride int
   398  	// Rectは、画像の境界です。
   399  	Rect Rectangle
   400  }
   401  
   402  func (p *CMYK) ColorModel() color.Model
   403  
   404  func (p *CMYK) Bounds() Rectangle
   405  
   406  func (p *CMYK) At(x, y int) color.Color
   407  
   408  func (p *CMYK) RGBA64At(x, y int) color.RGBA64
   409  
   410  func (p *CMYK) CMYKAt(x, y int) color.CMYK
   411  
   412  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   413  func (p *CMYK) PixOffset(x, y int) int
   414  
   415  func (p *CMYK) Set(x, y int, c color.Color)
   416  
   417  func (p *CMYK) SetRGBA64(x, y int, c color.RGBA64)
   418  
   419  func (p *CMYK) SetCMYK(x, y int, c color.CMYK)
   420  
   421  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   422  // 返される値は、元の画像とピクセルを共有します。
   423  func (p *CMYK) SubImage(r Rectangle) Image
   424  
   425  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   426  func (p *CMYK) Opaque() bool
   427  
   428  // NewCMYKは、指定された境界を持つ新しいCMYKイメージを返します。
   429  func NewCMYK(r Rectangle) *CMYK
   430  
   431  // Palettedは、指定されたパレットへのuint8インデックスのインメモリイメージです。
   432  type Paletted struct {
   433  	// Pixは、画像のピクセルをパレットインデックスとして保持します。ピクセルは
   434  	// (x, y)はPix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1]で始まります。
   435  	Pix []uint8
   436  	// Strideは、垂直方向の隣接ピクセル間のPixストライド(バイト単位)です。
   437  	Stride int
   438  	// Rectは、画像の境界です。
   439  	Rect Rectangle
   440  	// Paletteは、画像のパレットです。
   441  	Palette color.Palette
   442  }
   443  
   444  func (p *Paletted) ColorModel() color.Model
   445  
   446  func (p *Paletted) Bounds() Rectangle
   447  
   448  func (p *Paletted) At(x, y int) color.Color
   449  
   450  func (p *Paletted) RGBA64At(x, y int) color.RGBA64
   451  
   452  // PixOffsetは、(x, y)のピクセルに対応するPixの最初の要素のインデックスを返します。
   453  func (p *Paletted) PixOffset(x, y int) int
   454  
   455  func (p *Paletted) Set(x, y int, c color.Color)
   456  
   457  func (p *Paletted) SetRGBA64(x, y int, c color.RGBA64)
   458  
   459  func (p *Paletted) ColorIndexAt(x, y int) uint8
   460  
   461  func (p *Paletted) SetColorIndex(x, y int, index uint8)
   462  
   463  // SubImageは、rを通じて見える画像pの一部を表す画像を返します。
   464  // 返される値は、元の画像とピクセルを共有します。
   465  func (p *Paletted) SubImage(r Rectangle) Image
   466  
   467  // Opaqueは、画像全体をスキャンし、それが完全に不透明であるかどうかを報告します。
   468  func (p *Paletted) Opaque() bool
   469  
   470  // NewPalettedは、指定された幅、高さ、およびパレットを持つ新しい [Paletted] イメージを返します。
   471  func NewPaletted(r Rectangle, p color.Palette) *Paletted