Pergunta

Nós temos uma aplicação que mostram um grande arquivo de imagem (imagem satélite) do recurso de rede local. Para acelerar o processamento de imagens, que dividem a imagem de manchas pequenas (por exemplo, 6x6 cm) e a aplicação das telhas-los de forma adequada. Mas cada vez que a imagem de satélite atualizadas, o pré-processo de divisão deve ser feito, o que é um trabalho demorado.

Eu me pergunto como podemos carregar os patches do arquivo original?

PS 1: Acho que a LeadTools biblioteca , mas precisamos de uma solução de código aberto.

PS 2: O aplicativo está em .NET C #

Editar 1: O formato não é um ponto para nós, mas atualmente é JPG. alterar o formato a um outro poderia ser considerar, mas o formato BMP é dificilmente aceitável, por causa disso grande volume.

Foi útil?

Solução

Eu WOTE uma tentativa de beautifull de resposta à sua pergunta, mas meu navegador comeu ...: (

Basicamente o que eu tentei dizer foi:

1.- Desde Jpeg (ea maioria dos formatos de compressão) usa uma compressão secuential, você sempre precisa para decodificar todos os bits que estão diante os que você precisa.
2.- A solução que proponho necessidade de ser feito com cada formato que você precisa de apoio.
3.- Há uma série de decodificadores open source jpeg que você pode modificar. descodificadores jpeg precisa blocos de descodificação de bits (de tamanho variável) que convertem em blocos de pixels de tamanho 8x8. O que você poderia fazer é modificar o código para salvar na memória apenas os blocos que você precisa e descartar todos os outros, logo que eles não são mais necessários (basicamente assim que eles são decodificados). Com esses blocos salva-memória, criar a imagem que você precisa.
4.- Desde Jpeg trabalha com blocos de 8x8, seu trabalho poderia ser mais fácil se você trabalhar com manchas de tamanhos múltiplos de 8 pixels.
5.- A modificação feita para o decodificador jpeg poderia ser usado para substituir o pré-processamento das imagens que você está fazendo se você salvar o patch e descartar os blocos assim que concluí-las. Seria muito rápido e menos memória consumindo.

Eu sei que ele precisa de um monte de trabalho e há um monte de detalhes a serem tomadas em consideração (especialmente se você trabalha com imagens a cores), mas se você precisar de desempenho Eu acredito que você vai sempre acabam brigando ou jogo (como você quero vê-lo) com os bytes.

Hope isso ajuda.

Outras dicas

Eu não estou 100% de certeza que você está depois, mas se você está procurando uma maneira de ir de string imagePath, Rectangle desiredPortion a um objeto System.Drawing.Image então talvez algo como isto:

public System.Drawing.Image LoadImagePiece(string imagePath, Rectangle desiredPortion)
{
   using (Image img = Image.FromFile(path))
   {
       Bitmap result = new Bitmap(desiredPortion.Width, desiredPortion.Height, PixelFormat.Format24bppRgb);
       using (Graphics g = Graphics.FromImage((Image)result))
       {
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.DrawImage(img, 0, 0, desiredPortion, GraphicsUnit.Pixel);
       }
       return result;
   }
}

Note que, por razões de desempenho que você pode querer considerar a construção de múltiplas imagens de saída de uma só vez ao invés de chamar isso várias vezes -. Talvez passá-lo uma série de retângulos e voltar uma matriz de imagens ou similares

Se não é isso que você está depois você pode esclarecer o que você está realmente procurando?

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