C ++: Qual é a maneira mais simples de ler e escrever BMP arquivos usando C ++ no Windows?
-
11-07-2019 - |
Pergunta
Eu gostaria de carregar um arquivo BMP, fazer algumas operações sobre ele na memória e saída de um novo arquivo de BMP usando C ++ no Windows (Win32 nativo). Estou ciente ImageMagick e do C ++ ligação Magick ++ , mas eu acho que é um exagero para este projecto desde que eu atualmente não estou interessado em outros formatos de arquivo ou plataformas.
Qual seria a maneira mais simples em termos de configuração do código para ler e gravar arquivos BMP? A resposta pode ser "apenas usar Magick ++, é o mais simples."
questão relacionada: Qual é a melhor biblioteca de manipulação de imagem ?
Solução
Ao desenvolver apenas para Windows Eu normalmente só usar o ATL CImage classe
Outras dicas
EasyBMP se você quiser suporte apenas bmp. I'ts bastante simples para começar a usar em poucos minutos, e é multiplataforma se você precisa disso.
Um arquivo BMP é composto por 3 estruturas. Um BITMAPFILEHEADER seguido por um BITMAPINFO seguido por uma matriz de bytes.
A maneira mais simples absoluta para carregar um arquivo BMP usando Win32 é chamar CreateFile, GetFileSize, ReadFile e CloseHandle para carregar o arquivo de imagem para a memória, e depois é só lançar um ponteiro para o buffer para um BITMAPFILEHEADER e de lá ir.
Eu minto, uma maneira mais simples é chamar LoadImage. Certificando-se de passar o sinalizador LR_DIBSECTION para garantir que GDI does not converter a imagem carregada em qualquer bitdepth a tela principal está configurado para. Isto tem a vantagem de obter-lhe um HBITMAP que você pode selecionar em um DC e, portanto, desenhar todo usando GDI.
Para salvá-lo no entanto, não há nenhum atalho. Você precisa preparar um BITMAPFILEHEADER, escrevê-lo, preencher um struct BITMAPINFO, gravação que fora, e, em seguida, os dados de pixel real.
O CBitmap classe faz BMP I / S.
#include <windows.h>
Eu não usei Magick ++, mas o Windows tem uma biblioteca chamado de Windows Imaging Component que provavelmente atender às suas necessidades.
Eu tentei CImage
como acima, mas eu tinha uma matriz C cheio de valores de pixel que eu simplesmente queria despejar como BMP (ou qualquer outro formato). CImage
não tem nenhum construtor para isso, e eu não queria ligar MFC (para CBitmap
) nem tentar braça IWIC.
O que foi fácil era CImg :
#include <cimg/cimg.h>
using namespace cimg_library;
//...
void SaveMyData(uint8_t *pxarray, int width, int height)
{
CImg<uint8_t> img(pxarray, width, height);
img.save_bmp("sav.bmp");
}