2011-11-01 13 views
5

Hi Ho due Writablebitmap, uno da jpg e un altro da PNG e utilizzare questo metodo per mescolare il colore in un ciclo:Png su jpeg (effetto water mark) di cattiva qualità?

private static Color Mix(Color from, Color to, float percent) 
{ 
    float amountFrom = 1.0f - percent; 
    return Color.FromArgb(
     (byte)(from.A * amountFrom + to.A * percent), 
     (byte)(from.R * amountFrom + to.R * percent), 
     (byte)(from.G * amountFrom + to.G * percent), 
     (byte)(from.B * amountFrom + to.B * percent)); 
} 

Il mio problema è nel canale alfa, il mio risultato effetto filigrana è male (qualità)!

Result

Questo è il png originale.

Original Pgn

Questo è il jpg originale.

Original Jpg

aiuto?

+0

Può essere più preciso circa la " cattiva qualità "della tua filigrana che vorresti evitare? – ObscureRobot

+0

Il tuo png è anti-alias, sarà solo bello su uno sfondo bianco. Ricomprimerlo a jpeg è stato il neck-shot. Nessuna soluzione semplice per questo, la filigrana non può usare l'anti-aliasing. –

+0

Penso che questo abbia a che fare con l'avere una fonte jpg. La compressione con perdita su un jpeg utilizza modelli psico-visivi per rendere meno visibili gli artefatti da compressione. La sovrapposizione di un'immagine sopra a questa immagine compressa farà saltare in aria questo modello. Il modo migliore per risolverlo è utilizzare una sorgente di immagini senza perdita di dati sia per la filigrana che per l'immagine sorgente. –

risposta

5

In questo caso probabilmente non si desidera che il risultato assuma un alfa dalla filigrana, si desidera che mantenga il 100% dell'opacità del JPEG. Invece di impostare il nuovo alpha su from.A * amountFrom + to.A * percent, utilizzare solo from.A.

Modifica: Inoltre, è necessario regolare lo percent in base all'alpha del PNG. Ecco il vostro campione, aggiornato:

private static Color Mix(Color from, Color to, float percent) 
{ 
    float amountTo = percent * to.A/255.0; 
    float amountFrom = 1.0f - amountTo; 
    return Color.FromArgb( 
     from.A, 
     (byte)(from.R * amountFrom + to.R * amountTo), 
     (byte)(from.G * amountFrom + to.G * amountTo), 
     (byte)(from.B * amountFrom + to.B * amountTo)); 
} 

ho convertito questo codice per Python e corse le immagini di esempio attraverso di essa con 0,5 per cento, ecco il risultato:

enter image description here

+0

L'hai detto prima che potessi. +1 sull'immagine se solo potessi valutarlo separatamente. – Candide

+0

@Ingenu, mi stavo chiedendo se qualcuno avrebbe notato il mio nuovo avatar. L'ho cambiato ieri sera. –

+0

Bene, risolto, grazie Mark è un lavoro! – JoeLoco

Problemi correlati