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