a velocidade do GDI + surpreendente decodificar e terrível velocidade sorteio!

StackOverflow https://stackoverflow.com/questions/271428

  •  06-07-2019
  •  | 
  •  

Pergunta


Obrigado por respostas, na verdade eu não estou confuso sobre chamar a 1024 * 768 pixels é mais lento do que 100 * 100 pixels ... É a lógica de uma tão simples .. O que me deixou intrigado é que algoritmo de interpolação de DrawImage pode ser muito lenta, enquanto existe muita melhor algoritmo, e seu decodificador parece possível decodificar a partir de um jpg com uma determinada resolução, ele é muito legal, eu procuro por algum tempo, mas não encontrar qualquer lib-se livre para fazer isso ...

É realmente estranho! Eu adicionar o seguinte código no método Paint. c: \ 1.jpg é lima 5M jpg, cerca de 4000 * 3000

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);

A descrição acima é muito rápido! tempo, mesmo real! Eu não acho que decodificar um 5m JPG pode ser tão rápido!

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);

O código acima se tornar muito lento

// --------------------------------------------- -----------------

Se eu adicionar Bitmap = Bitmap :: FromFile (L "c: \ 1.jpg", true); // em construção

licença

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);

no método OnPaint, O código ainda é um pouco lento ~~~

// --------------------------------------------- ---------------------

Em comparação com a decodificação, o Processo drawImage é realmente lento ...

Por que e Como eles fizeram isso? Que a Microsoft pagar os homens que tomam carga de decodificador salário dobro do que os homens que tomam encarregado de escrever DrawingImage?

Foi útil?

Solução

Você não precisa JPGs decodificar se você está escalando para baixo por um fator de 8. imagens JPG consistem em blocos de 8 por 8 pixels, DCT-transformado. O valor médio de este bloco é o coeficiente de 0,0 a DCT. Então, escala para baixo um fator de 8 é apenas uma questão de jogar fora todos os outros componentes. Dimensionamento ainda mais para baixo (por exemplo, 4000-> 200) é apenas uma questão de escala para baixo de 4000 a 500, e depois escalando normalmente de 500 para 200 pixels.

Outras dicas

Então, o que você está realmente querendo saber é por que

graphics.DrawImage(bitmap,0,0,200,200);

é mais rápido do que

graphics.DrawImage(bitmap,0,0,2000,2000);

Correto?

Bem, o fato de que você está desenhando 100 vezes mais pixels no segundo caso, poderia ter algo a ver com isso.

Poderia ser possível que a decodificação é adiada até que necessário. É por isso que é tão rápido.

Talvez sobre o caso 200x200 GDI + única decodifica blocos suficientes para pintar 200x200 e em 2000x2000 que decodifica mais.

rotinas gráficas sempre contém algumas otimizações obscuros, você nunca poderia saber.

refletor irá dizer-lhe?

Apenas um palpite, mas você pode tentar desenhar com 4000x3000 ou 2000x1500? Talvez o fato de que 4000 e 3000 são divisíveis por 200 está acelerando o todo e 3000 não ser divisível por 200 retarda (embora isso realmente seria estranho).

Geralmente, fazer alguma medição de perfis ou tempo. Se 2000x2000 é cerca de 100 vezes mais lento do que 200x200, tudo está bem. E não se preocupe se 2000x2000 é muito lento. Se sua tela é de 1024x768, você não pode ver toda a imagem, então é melhor escolher a parte da imagem que é visível na tela e desenhá-la, 1024x768 é 5 vezes mais rápido do que 2000x2000.

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