-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Closed
Description
Currently all of the data about the format/mode of an image is stored in the image itself.
Pillow/src/libImaging/Imaging.h
Lines 80 to 107 in ad7be55
| struct ImagingMemoryInstance { | |
| /* Format */ | |
| char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", | |
| "YCbCr", "BGR;xy") */ | |
| int type; /* Data type (IMAGING_TYPE_*) */ | |
| int depth; /* Depth (ignored in this version) */ | |
| int bands; /* Number of bands (1, 2, 3, or 4) */ | |
| int xsize; /* Image dimension. */ | |
| int ysize; | |
| /* Colour palette (for "P" images only) */ | |
| ImagingPalette palette; | |
| /* Data pointers */ | |
| UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */ | |
| INT32 **image32; /* Set for 32-bit images (pixelsize=4). */ | |
| /* Internals */ | |
| char **image; /* Actual raster data. */ | |
| char *block; /* Set if data is allocated in a single block. */ | |
| ImagingMemoryBlock *blocks; /* Memory blocks for pixel storage */ | |
| int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */ | |
| int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ | |
| /* Virtual methods */ | |
| void (*destroy)(Imaging im); | |
| }; |
I think it would be cleaner if this information was stored in a separate struct.
struct ImageMode {
char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */
int type; /* Data type (IMAGING_TYPE_*) */
int depth; /* Depth (ignored in this version) */
int bands; /* Number of bands (1, 2, 3, or 4) */
int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */
};Furthermore, I think some more changes could be made that would simplify coding for some calculations, and allow for more image formats to be processed (#1888).
struct BandDataType {
char dataType; /* 'u' = unsigned integer, 's' = signed integer, 'f' = floating point */
UINT8 numBytes;
} BAND_DATA_TYPES[] = {
{'u', 1}, /* UINT8 */
{'u', 2}, /* UINT16 */
{'s', 4}, /* INT32 */
{'f', 4}, /* FLOAT32 */
};
/* Normal bands are treated normally */
/* Alpha bands may be treated specially by some calculations */
/* Extra bands are ignored (this could be used for padding, or maybe storing non-image data) */
enum BandType { NORMAL, ALPHA, EXTRA };
struct Band {
char *name; /* "R", "G", "B", "Y", "Cb", "Cr", etc. */
BandDataType dataType;
BandType type;
};
struct ImageFormat {
char *name; /* Format name ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */
Band *bands; /* Array of bands in this format */
UINT32 numBands; /* Number of bands in this format */
UINT32 numBytes; /* Total size in bytes of one pixel in this format */
};Metadata
Metadata
Assignees
Labels
No labels