Sto tentando di rimuovere tutti i pixel bianchi o trasparenti da un'immagine, lasciando l'immagine reale (ritagliata). Ho provato alcune soluzioni, ma nessuna sembra funzionare. Qualche suggerimento o ho intenzione di passare la notte a scrivere il codice di ritaglio delle immagini?C# - Ritaglia trasparente/Spazio bianco
risposta
public Bitmap CropBitmap(Bitmap original)
{
// determine new left
int newLeft = -1;
for (int x = 0; x < original.Width; x++)
{
for (int y = 0; y < original.Height; y++)
{
Color color = original.GetPixel(x, y);
if ((color.R != 255) || (color.G != 255) || (color.B != 255) ||
(color.A != 0))
{
// this pixel is either not white or not fully transparent
newLeft = x;
break;
}
}
if (newLeft != -1)
{
break;
}
// repeat logic for new right, top and bottom
}
Bitmap ret = new Bitmap(newRight - newLeft, newTop - newBottom);
using (Graphics g = Graphics.FromImage(ret)
{
// copy from the original onto the new, using the new coordinates as
// source coordinates for the original
g.DrawImage(...);
}
return ret
}
Si noti che questa funzione sarà lenta come sporco. GetPixel()
è incredibilmente lento e anche l'accesso alle proprietà Width
e Height
di un Bitmap
all'interno di un ciclo è lento. LockBits
sarebbe il modo corretto per farlo: ci sono un sacco di esempi qui su StackOverflow.
Grazie, mi sono trovato a metà strada lì. L'unico problema è, voglio anche ridimensionare l'immagine se è più grande di una dimensione specificata. C'è più codice di quello che si adatta alla casella dei commenti, ma l'immagine originale occupa solo metà dell'immagine finale. Il codice è http://pastebin.com/He3S8aCH – Echilon
Ho trasposto due variabili: P. Risolto il problema, aspettatevi presto un post sul blog (vi collegherò qui). – Echilon
Penso di aver sbagliato anche io. I bit che dicono 'color.R! = 0' ecc. Dovrebbero effettivamente dire' color.R! = 255', poiché un pixel bianco avrà valori R, G e B di 255 per ciascuno (un RGB di 0,0, 0 è nero). Se la versione originale ha funzionato per te, probabilmente ha ritagliato solo i pixel trasparenti (e quelli neri). – MusiGenesis
In WPF abbiamo una classe WriteableBitmap. E 'questo che stai cercando? Se è il caso, dai un'occhiata a http://blogs.msdn.com/b/jgalasyn/archive/2008/04/17/using-writeablebitmap-to-display-a-procedural-texture.aspx
Il controllo per pixel dovrebbe fare il trucco. Scansione di ogni riga per trovare la linea vuota dall'alto & in basso, scansionare ogni riga per trovare i vincoli di destra a sinistra & (questo può essere fatto in un passaggio con righe o colonne). Quando viene trovato il vincolo, copia la parte dell'immagine su un altro buffer.
Quindi, quello che vuoi fare è trovare il pixel in alto a sinistra più bianco/trasparente e in basso a destra il pixel non bianco/trasparente. Queste due coordinate ti daranno un rettangolo che potrai estrarre.
// Load the bitmap
Bitmap originalBitmap = Bitmap.FromFile("d:\\temp\\test.bmp") as Bitmap;
// Find the min/max non-white/transparent pixels
Point min = new Point(int.MaxValue, int.MaxValue);
Point max = new Point(int.MinValue, int.MinValue);
for (int x = 0; x < originalBitmap.Width; ++x)
{
for (int y = 0; y < originalBitmap.Height; ++y)
{
Color pixelColor = originalBitmap.GetPixel(x, y);
if (!(pixelColor.R == 255 && pixelColor.G == 255 && pixelColor.B == 255)
|| pixelColor.A < 255)
{
if (x < min.X) min.X = x;
if (y < min.Y) min.Y = y;
if (x > max.X) max.X = x;
if (y > max.Y) max.Y = y;
}
}
}
// Create a new bitmap from the crop rectangle
Rectangle cropRectangle = new Rectangle(min.X, min.Y, max.X - min.X, max.Y - min.Y);
Bitmap newBitmap = new Bitmap(cropRectangle.Width, cropRectangle.Height);
using (Graphics g = Graphics.FromImage(newBitmap))
{
g.DrawImage(originalBitmap, 0, 0, cropRectangle, GraphicsUnit.Pixel);
}
Ottima soluzione! Ho rimosso '|| pixelColor.A <255' per farlo funzionare. – krlzlx
Ho trovato un metodo per eseguire il batch di alcune migliaia di file .jpg in circa 10 minuti, ma non l'ho fatto nel codice. Ho usato la funzionalità Converti di Snag-It Editor. Non so se questa sia un'opzione per te, se hai bisogno di eseguire questa operazione una volta o se il tuo bisogno è in corso, ma per il prezzo del software, che non è molto, ho considerato questa soluzione decente. (io non lavorano o che rappresentano Techsmith.)
Joey
- 1. Ritaglia lo spazio bianco dell'immagine automaticamente usando jQuery
- 2. Ritaglia immagine in PHP
- 3. WebImage Ritaglia per quadrato
- 4. 'Ritaglia' un array bidimensionale?
- 5. Ritaglia immagine Android personalizzata
- 6. Ritaglia un'immagine bitmap
- 7. C# Ritaglia e ridimensiona le immagini di grandi dimensioni
- 8. Genera immagine rumore bianco in C#
- 9. Swift: Ritaglia ed esporta video
- 10. Intent fotocamera Android con Ritaglia
- 11. Ritaglia l'immagine senza OutOfMemory - Android
- 12. ridimensiona e ritaglia immagine centrata
- 13. Ritaglia bordi neri con OpenCV
- 14. Ritaglia un'immagine fissa in Android
- 15. Ritaglia un'immagine usando diverse patch in matplotlib
- 16. Pygame e blitting: bianco su bianco = grigio?
- 17. Ritaglia immagine come cerchio in Android
- 18. UIImagePickerController - ritaglia l'immagine sul quadrato (in verticale)
- 19. Ritaglia la parte particolare dell'immagine in Android
- 20. Ritaglia l'immagine quadrata al cerchio - Programmabile
- 21. Trasforma prospettiva + Ritaglia in iOS con OpenCV
- 22. Ritaglia un'immagine PNG alle dimensioni minime
- 23. Ritaglia o maschera un'immagine in un cerchio
- 24. Perché Graphics.DrawImage ritaglia parte della mia immagine?
- 25. Animate un UIBezierPath che ritaglia una UIImage
- 26. Come si legge lo spazio bianco usando scanf in c?
- 27. Come creare un png trasparente in bianco in Objective-C?
- 28. convertito bitonale TIFF in bianco e nero PNG in C#
- 29. Qual è il simbolo per lo spazio bianco in C?
- 30. Aggiungi spazio bianco a stringbuilder?
quindi ci sono altre persone che sognano di continuamente a scrivere la stessa riga di codice più e più volte? Pensavo di essere l'unico :-) –
sarebbe di aiuto alla comunità se si dettaglio almeno uno dei tuoi approcci e ha spiegato come non ha funzionato. –