reader.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. // ◄◄◄ gobmp/reader.go ►►►
  2. // Copyright © 2012 Jason Summers
  3. // Use of this code is governed by an MIT-style license that can
  4. // be found in the readme.md file.
  5. //
  6. // BMP file decoder
  7. //
  8. // Package gobmp implements a BMP image decoder and encoder.
  9. package gobmp
  10. import "image"
  11. import "image/color"
  12. import "io"
  13. import "fmt"
  14. const (
  15. bI_RGB = 0
  16. bI_RLE8 = 1
  17. bI_RLE4 = 2
  18. bI_BITFIELDS = 3
  19. )
  20. type bitFieldsInfo struct {
  21. mask uint32
  22. shift uint
  23. scale float64 // Amount to multiply the sample value by, to scale it to [0..255]
  24. }
  25. type decoder struct {
  26. r io.Reader
  27. img_Paletted *image.Paletted // Used if dstHasPalette is true
  28. img_NRGBA *image.NRGBA // Used otherwise
  29. bfOffBits uint32
  30. headerSize uint32
  31. width int
  32. height int
  33. bitCount int
  34. biCompression uint32
  35. isTopDown bool
  36. srcPalNumEntries int
  37. srcPalBytesPerEntry int
  38. srcPalSizeInBytes int
  39. dstPalNumEntries int
  40. dstHasPalette bool
  41. dstPalette color.Palette
  42. hasBitFieldsSegment bool
  43. bitFieldsSegmentSize int
  44. bitFields [4]bitFieldsInfo
  45. }
  46. // An UnsupportedError reports that the input uses a valid but unimplemented
  47. // BMP feature.
  48. type UnsupportedError string
  49. func (e UnsupportedError) Error() string { return "bmp: unsupported feature: " + string(e) }
  50. // A FormatError reports that the input is not a valid BMP file.
  51. type FormatError string
  52. func (e FormatError) Error() string { return "bmp: invalid format: " + string(e) }
  53. func getWORD(b []byte) uint32 {
  54. return uint32(b[0]) | uint32(b[1])<<8
  55. }
  56. func getDWORD(b []byte) uint32 {
  57. return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
  58. }
  59. func decodeRow_paletted(d *decoder, buf []byte, j int) error {
  60. for i := 0; i < d.width; i++ {
  61. var v byte
  62. switch d.bitCount {
  63. case 8:
  64. v = buf[i]
  65. case 4:
  66. v = (buf[i/2] >> (4 * (1 - uint(i)%2))) & 0x0f
  67. case 2:
  68. v = (buf[i/4] >> (2 * (3 - uint(i)%4))) & 0x03
  69. case 1:
  70. v = (buf[i/8] >> (1 * (7 - uint(i)%8))) & 0x01
  71. }
  72. if int(v) >= d.dstPalNumEntries {
  73. // Out-of-range palette index.
  74. // Most BMP viewers use the first palette color for such pixels, so
  75. // that's what we'll do.
  76. v = 0
  77. }
  78. d.img_Paletted.Pix[j*d.img_Paletted.Stride+i] = v
  79. }
  80. return nil
  81. }
  82. func decodeRow_16or32(d *decoder, buf []byte, j int) error {
  83. for i := 0; i < d.width; i++ {
  84. var v uint32
  85. if d.bitCount == 16 {
  86. v = uint32(getWORD(buf[i*2 : i*2+2]))
  87. } else { // bitCount == 32
  88. v = getDWORD(buf[i*4 : i*4+4])
  89. }
  90. for k := 0; k < 4; k++ {
  91. var sv uint8
  92. if d.bitFields[k].mask == 0 {
  93. if k == 3 {
  94. // If alpha mask is missing, make the pixel opaque.
  95. sv = 255
  96. } else {
  97. // If some other mask is missing, who knows what to do?
  98. sv = 0
  99. }
  100. } else {
  101. sv = uint8(0.5 + float64((v&d.bitFields[k].mask)>>d.bitFields[k].shift)*
  102. d.bitFields[k].scale)
  103. }
  104. d.img_NRGBA.Pix[j*d.img_NRGBA.Stride+i*4+k] = sv
  105. }
  106. }
  107. return nil
  108. }
  109. func decodeRow_24(d *decoder, buf []byte, j int) error {
  110. for i := 0; i < d.width; i++ {
  111. for k := 0; k < 3; k++ {
  112. d.img_NRGBA.Pix[j*d.img_NRGBA.Stride+i*4+k] = buf[i*3+2-k]
  113. }
  114. d.img_NRGBA.Pix[j*d.img_NRGBA.Stride+i*4+3] = 255
  115. }
  116. return nil
  117. }
  118. type decodeRowFuncType func(d *decoder, buf []byte, j int) error
  119. var rowDecoders = map[int]decodeRowFuncType{
  120. 1: decodeRow_paletted,
  121. 2: decodeRow_paletted,
  122. 4: decodeRow_paletted,
  123. 8: decodeRow_paletted,
  124. 16: decodeRow_16or32,
  125. 24: decodeRow_24,
  126. 32: decodeRow_16or32,
  127. }
  128. func (d *decoder) readBitsUncompressed() error {
  129. var err error
  130. srcRowStride := ((d.width*d.bitCount + 31) / 32) * 4
  131. buf := make([]byte, srcRowStride)
  132. decodeRowFunc := rowDecoders[d.bitCount]
  133. if decodeRowFunc == nil {
  134. return nil
  135. }
  136. for srcRow := 0; srcRow < d.height; srcRow++ {
  137. var dstRow int
  138. if d.isTopDown {
  139. dstRow = srcRow
  140. } else {
  141. dstRow = d.height - srcRow - 1
  142. }
  143. _, err = io.ReadFull(d.r, buf)
  144. if err != nil {
  145. return err
  146. }
  147. err = decodeRowFunc(d, buf, dstRow)
  148. if err != nil {
  149. return err
  150. }
  151. }
  152. return nil
  153. }
  154. func (d *decoder) skipBytes(n int) error {
  155. var buf [1024]byte
  156. for n > 0 {
  157. bytesToRead := len(buf)
  158. if bytesToRead > n {
  159. bytesToRead = n
  160. }
  161. _, err := io.ReadFull(d.r, buf[:bytesToRead])
  162. if err != nil {
  163. return err
  164. }
  165. n -= bytesToRead
  166. }
  167. return nil
  168. }
  169. // If there is a gap before the bits, skip over it.
  170. func (d *decoder) readGap() error {
  171. currentOffset := 14 + int(d.headerSize) + d.bitFieldsSegmentSize + d.srcPalSizeInBytes
  172. if currentOffset == int(d.bfOffBits) {
  173. return nil
  174. }
  175. if currentOffset > int(d.bfOffBits) {
  176. return FormatError("bad bfOffBits field")
  177. }
  178. gapSize := int(d.bfOffBits) - currentOffset
  179. return d.skipBytes(gapSize)
  180. }
  181. // Read a 12-byte BITMAPCOREHEADER.
  182. func decodeInfoHeader12(d *decoder, h []byte, configOnly bool) error {
  183. d.width = int(getWORD(h[4:6]))
  184. d.height = int(getWORD(h[6:8]))
  185. d.bitCount = int(getWORD(h[10:12]))
  186. d.srcPalBytesPerEntry = 3
  187. if d.bitCount >= 1 && d.bitCount <= 8 {
  188. d.srcPalNumEntries = 1 << uint(d.bitCount)
  189. }
  190. // Figure out how many palette entries there are.
  191. // A full-size palette is expected, but if the palette is overlapped by the
  192. // bitmap, we assume the palette is less than full size.
  193. paletteStart := 14 + int(d.headerSize)
  194. paletteEnd := paletteStart + d.srcPalBytesPerEntry*d.srcPalNumEntries
  195. if int(d.bfOffBits) >= paletteStart+d.srcPalBytesPerEntry && int(d.bfOffBits) < paletteEnd {
  196. d.srcPalNumEntries = (int(d.bfOffBits) - paletteStart) / 3
  197. }
  198. return nil
  199. }
  200. // Read a 40-byte BITMAPINFOHEADER.
  201. // Use of this function does not imply that the entire header is 40 bytes.
  202. // We may just be decoding the first 40 bytes of a 108- or 124-byte header.
  203. func decodeInfoHeader40(d *decoder, h []byte, configOnly bool) error {
  204. d.width = int(int32(getDWORD(h[4:8])))
  205. d.height = int(int32(getDWORD(h[8:12])))
  206. if d.height < 0 {
  207. d.isTopDown = true
  208. d.height = -d.height
  209. }
  210. d.bitCount = int(getWORD(h[14:16]))
  211. if configOnly {
  212. return nil
  213. }
  214. if len(h) >= 20 {
  215. d.biCompression = getDWORD(h[16:20])
  216. }
  217. if d.biCompression == bI_BITFIELDS && d.headerSize == 40 && d.bitCount != 1 {
  218. d.hasBitFieldsSegment = true
  219. d.bitFieldsSegmentSize = 12
  220. }
  221. if d.biCompression == bI_RGB {
  222. if d.bitCount == 16 {
  223. // Default bitfields for 16-bit images:
  224. d.recordBitFields(0x7c00, 0x03e0, 0x001f, 0)
  225. } else if d.bitCount == 32 {
  226. // Default bitfields for 32-bit images:
  227. d.recordBitFields(0x00ff0000, 0x0000ff00, 0x000000ff, 0)
  228. }
  229. }
  230. var biClrUsed uint32
  231. if len(h) >= 36 {
  232. biClrUsed = getDWORD(h[32:36])
  233. }
  234. if biClrUsed > 10000 {
  235. return FormatError(fmt.Sprintf("bad palette size %d", biClrUsed))
  236. }
  237. // Figure out how many colors (that we care about) are in the palette.
  238. if d.bitCount >= 1 && d.bitCount <= 8 {
  239. if biClrUsed == 0 || biClrUsed > (1<<uint(d.bitCount)) {
  240. d.srcPalNumEntries = 1 << uint(d.bitCount)
  241. } else {
  242. d.srcPalNumEntries = int(biClrUsed)
  243. }
  244. } else {
  245. d.srcPalNumEntries = 0
  246. }
  247. d.srcPalBytesPerEntry = 4
  248. if d.headerSize == 64 && d.srcPalNumEntries > 0 {
  249. // A hack to allow (invalid?) OS/2v2 BMPs that have 3 bytes per palette
  250. // entry instead of 4.
  251. if 14+d.headerSize+uint32(d.bitFieldsSegmentSize)+3*uint32(d.srcPalNumEntries) ==
  252. d.bfOffBits {
  253. d.srcPalBytesPerEntry = 3
  254. }
  255. }
  256. return nil
  257. }
  258. func decodeInfoHeader108(d *decoder, h []byte, configOnly bool) error {
  259. var err error
  260. err = decodeInfoHeader40(d, h[:40], configOnly)
  261. if err != nil {
  262. return err
  263. }
  264. if d.biCompression == bI_BITFIELDS {
  265. var bf_alpha uint32
  266. if len(h) >= 56 {
  267. bf_alpha = getDWORD(h[52:56])
  268. }
  269. d.recordBitFields(getDWORD(h[40:44]), getDWORD(h[44:48]),
  270. getDWORD(h[48:52]), bf_alpha)
  271. }
  272. return nil
  273. }
  274. type decodeInfoHeaderFuncType func(d *decoder, h []byte, configOnly bool) error
  275. func readInfoHeader(d *decoder, configOnly bool) error {
  276. var h []byte
  277. var err error
  278. var decodeFn decodeInfoHeaderFuncType
  279. switch d.headerSize {
  280. case 12:
  281. decodeFn = decodeInfoHeader12
  282. case 16, 20, 24, 32, 36, 40, 42, 44, 46, 48, 60, 64:
  283. decodeFn = decodeInfoHeader40
  284. case 52, 56, 108, 124:
  285. decodeFn = decodeInfoHeader108
  286. default:
  287. return UnsupportedError(fmt.Sprintf("BMP version (header size %d)", d.headerSize))
  288. }
  289. // Read the rest of the infoheader
  290. h = make([]byte, d.headerSize)
  291. _, err = io.ReadFull(d.r, h[4:])
  292. if err != nil {
  293. return err
  294. }
  295. err = decodeFn(d, h, configOnly)
  296. if err != nil {
  297. return err
  298. }
  299. if d.width < 1 {
  300. return FormatError(fmt.Sprintf("bad width %d", d.width))
  301. }
  302. if d.height < 1 {
  303. return FormatError(fmt.Sprintf("bad height %d", d.height))
  304. }
  305. if d.bitCount >= 1 && d.bitCount <= 8 {
  306. d.dstHasPalette = true
  307. }
  308. d.srcPalSizeInBytes = d.srcPalNumEntries * d.srcPalBytesPerEntry
  309. return nil
  310. }
  311. func (d *decoder) recordBitFields(r, g, b, a uint32) {
  312. d.bitFields[0].mask = r
  313. d.bitFields[1].mask = g
  314. d.bitFields[2].mask = b
  315. d.bitFields[3].mask = a
  316. // Based on .mask, set the other fields of the bitFields struct
  317. for k := 0; k < 4; k++ {
  318. if d.bitFields[k].mask == 0 {
  319. continue
  320. }
  321. // Starting with the low bit, count the number of 0 bits before
  322. // the first 1 bit.
  323. tmpMask := d.bitFields[k].mask
  324. for tmpMask&0x1 == 0 {
  325. d.bitFields[k].shift++
  326. tmpMask >>= 1
  327. }
  328. d.bitFields[k].scale = 255.0 / float64(tmpMask)
  329. }
  330. }
  331. func (d *decoder) readBitFieldsSegment() error {
  332. buf := make([]byte, d.bitFieldsSegmentSize)
  333. _, err := io.ReadFull(d.r, buf[:])
  334. if err != nil {
  335. return err
  336. }
  337. d.recordBitFields(getDWORD(buf[0:4]), getDWORD(buf[4:8]),
  338. getDWORD(buf[8:12]), 0)
  339. return nil
  340. }
  341. func (d *decoder) readPalette() error {
  342. var err error
  343. buf := make([]byte, d.srcPalSizeInBytes)
  344. _, err = io.ReadFull(d.r, buf)
  345. if err != nil {
  346. return err
  347. }
  348. if !d.dstHasPalette {
  349. d.dstPalNumEntries = 0
  350. return nil
  351. }
  352. d.dstPalNumEntries = d.srcPalNumEntries
  353. if d.dstPalNumEntries > 256 {
  354. d.dstPalNumEntries = 256
  355. }
  356. d.dstPalette = make(color.Palette, d.dstPalNumEntries)
  357. for i := 0; i < d.dstPalNumEntries; i++ {
  358. d.dstPalette[i] = color.RGBA{buf[i*d.srcPalBytesPerEntry+2],
  359. buf[i*d.srcPalBytesPerEntry+1],
  360. buf[i*d.srcPalBytesPerEntry+0], 255}
  361. }
  362. return nil
  363. }
  364. func (d *decoder) decodeFileHeader(b []byte) error {
  365. if b[0] != 0x42 || b[1] != 0x4d {
  366. return FormatError("not a BMP file")
  367. }
  368. d.bfOffBits = getDWORD(b[10:14])
  369. return nil
  370. }
  371. func (d *decoder) readHeaders(configOnly bool) error {
  372. var fh [18]byte
  373. var err error
  374. // Read the file header, and the first 4 bytes of the info header
  375. _, err = io.ReadFull(d.r, fh[:])
  376. if err != nil {
  377. return err
  378. }
  379. err = d.decodeFileHeader(fh[0:14])
  380. if err != nil {
  381. return err
  382. }
  383. d.headerSize = getDWORD(fh[14:18])
  384. err = readInfoHeader(d, configOnly)
  385. if err != nil {
  386. return err
  387. }
  388. return nil
  389. }
  390. func (d *decoder) readMain(r io.Reader, configOnly bool) (image.Image, error) {
  391. var err error
  392. // Read the FILEHEADER and INFOHEADER.
  393. err = d.readHeaders(false)
  394. if err != nil {
  395. return nil, err
  396. }
  397. // Make sure bitcount and "compression" are valid and compatible.
  398. switch d.biCompression {
  399. case bI_RGB:
  400. // We allow bitCount=2 because Windows CE defines it to be valid
  401. // (at least if headerSize=40).
  402. if d.bitCount != 1 && d.bitCount != 2 && d.bitCount != 4 && d.bitCount != 8 &&
  403. d.bitCount != 16 && d.bitCount != 24 && d.bitCount != 32 {
  404. return nil, FormatError(fmt.Sprintf("bad bit count %d", d.bitCount))
  405. }
  406. case bI_RLE4:
  407. if d.bitCount != 4 {
  408. return nil, FormatError(fmt.Sprintf("bad RLE4 bit count %d", d.bitCount))
  409. }
  410. case bI_RLE8:
  411. if d.bitCount != 8 {
  412. return nil, FormatError(fmt.Sprintf("bad RLE8 bit count %d", d.bitCount))
  413. }
  414. case bI_BITFIELDS:
  415. if d.bitCount == 1 {
  416. return nil, UnsupportedError("Huffman 1D compression")
  417. } else if d.bitCount != 16 && d.bitCount != 32 {
  418. return nil, FormatError(fmt.Sprintf("bad BITFIELDS bit count %d", d.bitCount))
  419. }
  420. default:
  421. return nil, UnsupportedError(fmt.Sprintf("compression or image type %d", d.biCompression))
  422. }
  423. // Assuming 'int' is 32 bits, an NRGBA image can't handle more than (2^31-1)/4
  424. // pixels. This test is more conservative than it could be.
  425. if d.width > 46340 || d.height > 46340 || d.width*d.height >= 0x20000000 {
  426. return nil, UnsupportedError("dimensions too large")
  427. }
  428. // Read the BITFIELDS segment, if present.
  429. if d.hasBitFieldsSegment {
  430. err = d.readBitFieldsSegment()
  431. if err != nil {
  432. return nil, err
  433. }
  434. }
  435. // Read the palette, if present.
  436. if d.srcPalNumEntries > 0 {
  437. err = d.readPalette()
  438. if err != nil {
  439. return nil, err
  440. }
  441. }
  442. if configOnly {
  443. return nil, nil
  444. }
  445. // Create the target image.
  446. if d.dstHasPalette {
  447. d.img_Paletted = image.NewPaletted(image.Rect(0, 0, d.width, d.height), d.dstPalette)
  448. } else {
  449. d.img_NRGBA = image.NewNRGBA(image.Rect(0, 0, d.width, d.height))
  450. }
  451. // Skip over any unused space preceding the bitmap bits.
  452. err = d.readGap()
  453. if err != nil {
  454. return nil, err
  455. }
  456. // Read the bitmap bits.
  457. if d.biCompression == bI_RLE4 || d.biCompression == bI_RLE8 {
  458. err = d.readBitsRLE()
  459. } else {
  460. err = d.readBitsUncompressed()
  461. }
  462. if err != nil {
  463. return nil, err
  464. }
  465. if d.dstHasPalette {
  466. return d.img_Paletted, nil
  467. }
  468. return d.img_NRGBA, nil
  469. }
  470. // Decode reads a BMP image from r and returns it as an image.Image.
  471. func Decode(r io.Reader) (image.Image, error) {
  472. var err error
  473. d := new(decoder)
  474. d.r = r
  475. im, err := d.readMain(r, false)
  476. return im, err
  477. }
  478. // DecodeConfig returns the color model and dimensions of the BMP image without
  479. // decoding the entire image.
  480. func DecodeConfig(r io.Reader) (image.Config, error) {
  481. var err error
  482. var cfg image.Config
  483. d := new(decoder)
  484. d.r = r
  485. _, err = d.readMain(r, true)
  486. if err != nil {
  487. return cfg, err
  488. }
  489. cfg.Width = d.width
  490. cfg.Height = d.height
  491. if d.dstHasPalette {
  492. cfg.ColorModel = d.dstPalette
  493. } else {
  494. cfg.ColorModel = color.NRGBAModel
  495. }
  496. return cfg, nil
  497. }
  498. func init() {
  499. image.RegisterFormat("bmp", "BM", Decode, DecodeConfig)
  500. }