Pergunta

Eu gostaria de ser capaz de criar uma grande (digamos 20.000 x 20.000) bitmap pixel em uma aplicação C ++ MFC, usando um CDC derivado classe para escrever para o bitmap. Eu tentei usar DCs de memória, conforme descrito na documentação do MSDN, mas estes parecem ser restrito para dimensões compatíveis com o driver de vídeo atual.

Atualmente estou usando um driver de bitmap de impressão para fazer o trabalho, mas é extremamente lento e utiliza grandes quantidades de armazenamento intermediário devido a spool informações GDI.

A solução que estou procurando não deve envolver metarquivos ou spool, como o modelo que eu estou desenhando leva muitos milhões de chamadas GDI para processar.

Eu poderia usar uma abordagem dividir e conquistar através de múltiplos DCs de memória, mas parece que um cumborsome bonita e técnica deselegante.

quaisquer pensamentos?

Foi útil?

Solução

CDC e CBitmap parece apenas bitmaps dependentes do dispositivo de apoio, você pode ter mais sorte criando o seu bitmap com :: CreateDIBSection , em seguida, anexar um CBitmap a isso. As interfaces GDI matérias são um pouco grisalho, infelizmente.

Você provavelmente não terá muita sorte com 20.000 x 20.000 em 32 BPP, pelo menos em um aplicativo de 32 bits, como o que sai em cerca de 1,5 GB de memória, mas eu tenho um back HBITMAP válido com 16 bpp:

BITMAPINFOHEADER bmi = { sizeof(bmi) };
bmi.biWidth = 20000;
bmi.biHeight = 20000;
bmi.biPlanes = 1;
bmi.biBitCount = 16;
HDC hdc = CreateCompatibleDC(NULL);
BYTE* pbData = 0;
HBITMAP hbm = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
DeleteObject(SelectObject(hdc, hbm));

Outras dicas

Esta é incomum como eu muitas vezes criou um DC com base na tela que será usada para uma imagem bitmap que é muito maior do que a tela - 3000 pixels, mais em alguns casos - sem problemas em tudo. Você tem um código de exemplo mostrando este problema em ação?

Considerando tal uma resolução de imagem grande, você não pode criar a imagem usando bitmaps compatíveis.

Exemplo:

de pixel profundidade = 32 bits = 4 bytes por pixel

de pixel count = 20.000 * 20.000 = 400.000.000

total de bytes = pixels contagem * 4 = 1.600.000.000 bytes = 1.562.500 kb ~ = 1525 MB ~ = 1.5GB

Estou especulando sobre as intenções finais, mas suponha que você queira criar e permitir aos usuários explorar uma mapa imenso com zooms muito detalhado. Você deve criar um formato de arquivo de imagem personalizada; você pode colocar dentro desse arquivo várias camadas que contêm grades de bitmaps por exemplo, a prestação de aceleração. O processo de tornar possível usar GDI DIB ou GDI + para criar imagens parciais e, em seguida, torná-los juntos. É claro que esta necessidade algumas experiências / otimizar para alcançar o sentimento de usuário perfeito.

boa sorte

Para manter o uso da memória dentro de limites aceitáveis, você terá que usar sua estratégia de 'dividir e conquistar'. Não é um hack, se implementadas direita é realmente uma maneira muito elegante de lidar com bitmaps de tamanho ilimitado. Se você projetar o certo, você pode combinar o 'único rende / show de parte da imagem', 'tornar toda a imagem em baixa resolução para exibição na tela' e 'tornar a coisa toda para um bitmap em disco' abordagens em um utilizadores do motor eo escudo do seu código (provavelmente se em duas semanas;)) dos internos. Eu trabalho em um produto com as mesmas questões: Rendição (potencialmente grande) mapeia tanto para a tela ou para arquivos .bmp

.

Se a imagem tem que ser desta resolução - dizer um oi-res varredura de um raio-x - então você pode querer olhar para escrever rotinas spool personalizado para ele - 1,5 gb é muito caro - até mesmo para desktops modernos <. / p>

Se for vetor baseado em seguida, você pode olhar para SVG como ele suporta vigias e mais permitem que você tornar a outros formatos. Eu uso SVG para JPG via Batik (java), de modo que é possível fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top