Creo que si fuera a hacer esto, probablemente usaría un código un poco más como este:
#include
#include
#include
#include
#pragma pack (push, 1)
struct bmp_header {
char magic [2];
uint32_t fileSize;
uint32_t res;
uint32_t offset;
uint32_t header_size;
uint32_t ancho;
uint32_t altura;
uint16_t bits_por_pixel;
};
#pragma pack (pop)
- ¿Cómo puede alguien que acaba de aprender Python practicar su uso?
- ¿Es 'ciencia de datos' simplemente un nombre elegante para la ingeniería de características?
- ¿Cómo motivaría a un estudiante de Ingeniería Informática que es un desastre académico completo antes de graduarse?
- ¿Qué es mejor, ingeniería eléctrica o ingeniería informática?
- ¿Cuáles son las éticas de probar NP = P?
std :: vector read_bmp (std :: string const & fname, int & w, int & h) {
bmp_header head;
std :: ifstream f (fname, std :: ios :: binario);
f.read ((char *) & head, sizeof (head));
if (head.bits_per_pixel! = 1)
regreso{};
w = ancho de cabeza;
h = altura de la cabeza;
// las líneas están alineadas en el límite de 4 bytes
int lineSize = (w / 8 + (w / 8)% 4);
int fileSize = lineSize * h;
std :: vector img (w * h);
std :: vector data (fileSize);
// encuentra bits
f.seekg (compensación de cabeza);
// leer datos
f.read ((char *) & data [0], fileSize);
// decodificar bits
int i, j, k, rev_j;
para (j = 0, rev_j = h – 1; j <h; j ++, rev_j–) {
para (i = 0; i <w / 8; i ++) {
int fpos = j * lineSize + i, pos = rev_j * w + i * 8;
para (k = 0; k <8; k ++)
img [pos + (7 – k)] = (datos [fpos] >> k) & 1;
}
}
volver img;
}
int main () {
int w, h, i, j;
std :: vector img = read_bmp (“test1.bmp”, w, h);
bits de char [] = “10”;
std :: cout << "Ancho:" << w << "\ n";
std :: cout << "Altura:" << h << "\ n";
para (j = 0; j <h; j ++) {
para (i = 0; i <w; i ++)
std :: cout << bits [img [j * w + i]] << "";
std :: cout << "\ n";
}
devuelve 0;
}
Contrariamente a las alegaciones de Filip, este sigue siendo solo un archivo, probablemente un poco más rápido que la versión C, y debería estar bien para cualquier tamaño de archivo. Ah, y como un pequeño bono menor, eliminé las pérdidas de memoria.
El código se ha vuelto un poco más largo (al menos en el recuento de líneas) pero bastante más fácil de leer y entender (al menos IMO). La mayoría de los cambios reales (especialmente la definición de la estructura para el encabezado del archivo) realmente se aplican tan bien en C como en C ++. Como me proporcionó los datos fácilmente, los modifiqué un poco para trabajar un poco más cerca de lo correcto (al menos una prueba rápida con un mapa de bits de 32 × 32 parecía producir resultados razonables, aunque definitivamente no he intentado probarlo a fondo en todos.