ImageInfo
What a file says about itself, read from its header alone: no pixel decode, no multi-megabyte allocation. This is what you want for laying out a grid before the images arrive, rejecting an upload that's 20000 px wide, or deciding whether a decoder should claim a file at all.
val info = KiteImage.probe(bytes)
if (info.width * info.height > budget) reject()
grid.reserve(info.displayWidth, info.displayHeight) // orientation appliedCost is proportional to the header, not the image: a few hundred bytes for PNG/JPEG/BMP/TIFF/WebP. GIF and APNG walk the frame structure (skipping every compressed byte) so frameCount is exact rather than a guess.
Constructors
Properties
height after orientation is applied.
width after orientation is applied: what the user will actually see.
the container, same value KiteImage.detect returns
number of animation frames; 1 for stills
the file declares an alpha channel or transparency. This is what the container says, not a pixel scan: an RGBA PNG whose pixels are all opaque still reports true. Use KiteBitmap.hasTransparency for the truth.
stored pixel height, before orientation
True when frameCount> 1.
whether this build's KiteImage.decode can actually produce pixels for this file. False means the format or a specific feature isn't implemented; unsupportedReason names it.
the EXIF orientation, Orientation.Normal when absent
human-readable reason when isDecodable is false
stored pixel width, before orientation