Pergunta

Então, aqui estão os detalhes (estou usando C # BTW):

Eu recebo uma imagem 32bpp (JPEG comprimido) de um servidor. Em algum ponto, eu gostaria de usar a propriedade paleta de um bitmap de cor mais saturada pixels (brilho> 240) RED. Para fazer isso, eu preciso para obter a imagem em um formato indexado.

Eu tentei converter a imagem para um GIF, mas tenho perda de qualidade. Eu tentei criar um novo bitmap em um formato de índice por estes métodos:

// causes a "Parameter not valid" error
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Indexed)

// no error, but the resulting image is black due to information loss I assume
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Format8bppIndexed)

Eu estou em uma perda agora. Os dados nesta imagem é alterada constantemente pelo usuário, então eu não quero definir manualmente pixels que têm um brilho> 240 se eu puder evitá-lo. Se eu posso definir a paleta de uma vez quando a imagem é criada, o meu trabalho é feito. Se eu vou sobre este o caminho errado para começar por favor me avise.

EDIT:. Obrigado rapazes, aqui está mais alguns detalhes sobre o que estou tentando realizar

Estamos digitalizar um slide tecido em alta resolução (aplicação patologia). Eu escrevo a interface para o scanner real. Nós usamos uma câmera de linha de varredura. Para testar a taxa de linha da câmera, o usuário verifica uma parcela muito pequena e olha para a imagem.

A imagem é exibida ao lado de uma barra de faixa. Quando o usuário move a barra de faixa (ajustando taxa de linha), eu mudar a intensidade geral da imagem em uma tentativa de modelar o que seria parecido com a nova taxa de linha. Eu faço isso usando um ImageAttributes e objeto ColorMatrix atualmente.

Quando o usuário ajusta o bar pista, eu ajustar a matriz. Isso não me dá informações por pixel, mas o desempenho é muito bom. I pode uso LockBits e algum código inseguro aqui, mas eu preferia não reescrevê-lo, se possível. Quando a nova imagem é criada, eu gostaria que todos os pixels com um valor de brilho de> 240 a ser de cor vermelha. Eu estava pensando que a definição de uma paleta para o bitmap na frente seria uma forma limpa de fazer isso.

Foi útil?

Solução 3

Obrigado pela ajuda todo mundo. Parece que isso pode ser resolvido usando a classe ImageAttributes e simplesmente definir uma tabela de cores remap.

ColorMap[] maps = new ColorMap[someNum]
//  add mappings
imageAttrs.SetRemapTable(maps);

Obrigado pela ajuda novamente, pelo menos eu aprendi alguma coisa.

Outras dicas

Indo de 32bpp para 8bpp indexados quase sempre resultam em perda de qualidade, a menos que a imagem original com menos de 256 cores total.

Você pode criar uma outra imagem que é uma sobreposição com os pixels afetados vermelho, em seguida, mostrar tanto daqueles?

Uma vez que você está indo para o brilho> 240, você pode converter a sobreposição em tons de cinza em primeiro lugar, em seguida, para indexado para obter os pixels overbright.

Você não especificar o que você está fazendo com ele depois de ter marcado os criminosos, então eu não sei se isso vai funcionar.

soa como algo que você poderia fazer facilmente com um pixel shader. Mesmo muito cedo modelos de sombreamento apoiaria algo tão simples como isto.

A questão é, no entanto:

Você pode incluir suporte shader em sua aplicação sem muito hastle?

Você sabe programação shader?

EDIT:

Você provavelmente não tem um contexto em 3D onde você pode fazer coisas como esta = /

Eu estava a maior parte arejar meus pensamentos.

Manipulando o pixel a pixel de imagem deve ser factível em tempo real com uma única CPU não deve ele?

Se não, olhar para a programação GPGPU e Open CL.

EDIT novamente:

Se você deu mais alguns detalhes sobre o que o aplicativo realmente não poderíamos ajudar um pouco mais? Por exemplo, se você está fazendo um web-app nenhuma das minhas dicas faria sentido.

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