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 ?

Foi útil?

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>

LoadImage

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");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top