code: def decode(image, symbols=None):
      
      pixels, width, height = _pixel_data(image)
  
      results = []
      with _image_scanner() as scanner:
          if symbols:
              # Disable all but the symbols of interest
              disable = set(ZBarSymbol).difference(symbols)
              for symbol in disable:
                  zbar_image_scanner_set_config(
                      scanner, symbol, ZBarConfig.CFG_ENABLE, 0
                  )
              # I think it likely that zbar will detect all symbol types by
              # default, in which case enabling the types of interest is
              # redundant but it seems sensible to be over-cautious and enable
              # them.
              for symbol in symbols:
                  zbar_image_scanner_set_config(
                      scanner, symbol, ZBarConfig.CFG_ENABLE, 1
                  )
          with _image() as img:
              zbar_image_set_format(img, _FOURCC['L800'])
              zbar_image_set_size(img, width, height)
              zbar_image_set_data(img, cast(pixels, c_void_p), len(pixels), None)
              decoded = zbar_scan_image(scanner, img)
              if decoded < 0:
                  raise PyZbarError('Unsupported image format')
              else:
                  results.extend(_decode_symbols(_symbols_for_image(img)))
  
      return results
docs: Decodes datamatrix barcodes in `image`.
  
      Args:
          image: `numpy.ndarray`, `PIL.Image` or tuple (pixels, width, height)
          symbols: iter(ZBarSymbol) the symbol types to decode; if `None`, uses
              `zbar`'s default behaviour, which is to decode all symbol types.
  
      Returns:
          :obj:`list` of :obj:`Decoded`: The values decoded from barcodes.