Domanda

Così qui sono i dati (sto usando C # BTW):

ricevo un'immagine 32bpp (JPEG compresso) da un server. Ad un certo punto, desidero utilizzare la proprietà tavolozza di un bitmap per colorare i pixel-saturi (luminosità> 240) rosso. Per farlo, ho bisogno di ottenere l'immagine in un formato indicizzato.

Ho provato a convertire l'immagine in un formato GIF, ma ottengo perdita di qualità. Ho provato a generare una nuova bitmap in formato indice da questi metodi:

// 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)

Sono in perdita ora. I dati di questa immagine è cambiata costantemente dall'utente, quindi non desidera impostare manualmente i pixel con una luminosità> 240 se posso evitarlo. Se posso impostare la tavolozza una volta quando si crea l'immagine, il mio lavoro è fatto. Se io vado su questo il modo sbagliato per iniziare con favore fatemelo sapere.

EDIT: Grazie ragazzi, qui è un po 'più in dettaglio su quello che sto cercando di realizzare

.

Ci scansione di una diapositiva tessuto ad alta risoluzione (applicazione patologia). Scrivo l'interfaccia allo scanner reale. Usiamo una telecamera a scansione lineare. Per testare la velocità di linea della telecamera, l'utente esegue la scansione di una porzione molto piccola e guarda l'immagine.

L'immagine viene visualizzata accanto a un bar pista. Quando l'utente sposta la barra di pista (regolazione velocità di linea), a cambiare l'intensità complessiva dell'immagine, nel tentativo di modellare ciò che sarebbe simile alla nuova velocità di linea. Lo faccio utilizzando un oggetto ImageAttributes e ColorMatrix attualmente.

Quando l'utente regola la barra di pista, ho regolare la matrice. Questo non mi dà per informazioni sui pixel, ma la prestazione è molto bello. I potrebbero uso LockBits e alcuni codice non sicuro qui, ma preferirei non riscriverlo, se possibile. Quando viene creata la nuova immagine, desidero per tutti i pixel con un valore di luminosità di> 240 da colorare rosso. Stavo pensando che la definizione di una gamma di colori per la bitmap in anticipo sarebbe un modo pulito di fare questo.

È stato utile?

Soluzione 3

Grazie per l'aiuto di tutti. Sembra che questo può essere risolto utilizzando la classe ImageAttributes e semplicemente impostare una tabella di colori rimappatura.

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

Grazie per l'aiuto nuovo, almeno ho imparato qualcosa.

Altri suggerimenti

Passando da 32bpp a 8bpp indicizzati quasi sempre causare la perdita di qualità, a meno che l'immagine originale ha meno di 256 colori totali.

Si può creare un'altra immagine che è una sovrapposizione con il pixel interessata rosso, poi mostrare sia di quelli?

Dal momento che si sta andando per luminosità> 240, è possibile convertire la sovrapposizione in scala di grigio, poi per indicizzato per ottenere i pixel troppo intensi.

Non si specifica cosa si sta facendo con esso una volta che avete etichettato i colpevoli, quindi non so se questo funzionerà.

Suona come qualcosa che si potrebbe fare facilmente con un pixel shader. Anche i modelli di shader molto presto sarebbe a favore di qualcosa di semplice come questo.

La domanda è però:

Si può includere il supporto dello shader nell'applicazione senza troppo sconveniente?

Sai programmazione degli shader?

EDIT:

Probabilmente non si dispone di un contesto in 3D in cui è possibile fare cose come questa = /

Mi è stato per lo più solo messa in onda i miei pensieri.

Manipolare il pixel per pixel dell'immagine dovrebbe essere fattibile in tempo reale con una singola CPU dovrebbe no?

In caso contrario, guardare in programmazione GPGPU e Open CL.

EDIT AGAIN:

Se ti ha dato qualche dettaglio in più su ciò che l'applicazione in realtà non ci potrebbe aiutare un po 'di più? Ad esempio, se si sta facendo un web-app nessuno dei miei suggerimenti avrebbe senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top