2014-05-23 10 views
14

Hat jemand eine gute Lösung, um die Farbe eines nicht transparenten Bereichs mithilfe von HTML5 oder Canvas (oder einer anderen HTML5-Technologie) zu ändern.Bildfarbe konvertieren, ohne den transparenten Hintergrund zu ändern

gegoogelt ich viel und fand einige Lösung (mit Canvas), die die Farbe eines Bildes ändern können, wie,

How do i tint an image with HTML5 Canvas?

Canvas - Change colors of an image using HTML5/CSS/JS?

Aber diese Lösung auch den transparenten Hintergrund ändern die angegebene Farbe (die ich nicht will).

Stackoverflow image with transparent pixel(background)

Es ist ein Stackoverflow mit transparentem Hintergrund PNG-Bild. Jetzt möchte ich die Bildfarbe ändern, ohne seine transparenten Pixel (Hintergrund) zu beeinflussen, so dass ich in der Lage bin, ein Bild wieder mit Hilfe der Leinwand toDataURL Methode mit neuer Farbe zu speichern.

Ich bin mir nicht sicher, ob es mit HTML5 möglich ist oder nicht. Jede Hilfe wird sehr geschätzt.

Vielen Dank im Voraus.

******************* EDITED *********************

Added neues Bild von Pille (Kapsel).

enter image description here

+0

Dies ist möglicherweise genau das, wonach Sie nicht suchen, aber was ich normalerweise tue, um die Bildfarbe zu ändern, ist es einfach ein wenig transparent zu machen und die Hintergrundfarbe auf die gewünschte Farbe zu setzen. – dcclassics

+0

@dcclassics: Ich denke, du missverstehst mich. Ich habe ein PNG-Bild mit einigen transparenten Pixeln, sagen wir, ein Mario (Zeichentrickfigur) PNG-Bild. Da Mario ein Charakter ist und eine polynomiale Seite hat. Unser Bild muss ein Pixel enthalten, das transparent ist. So, jetzt möchte ich die Farbe eines Zeichens (Mario) ändern, ohne die transparenten Pixel zu ändern. –

+0

Wahrscheinlich möchten Sie 'canvas.getImageData' und' putImageData', mit denen Sie eine Leinwand Pixel für Pixel mit RGBA-Werten bearbeiten können. Siehe [dieses Tutorial] (http://beej.us/blog/data/html5s-canvas-2-pixel/) für einen Start. – apsillers

Antwort

26

Eine Demo (siehe zu diesem Demo-Hinweis unten): http://jsfiddle.net/m1erickson/2d7ZN/

enter image description here

Sie ein Array erhalten kann das Bild des RGBA-Pixeldaten enthält, unter Verwendung von context.getImageData

var imageData=context.getImageData(0,0,canvas.width,canvas.height); 

var data=imageData.data; 

Von dort können Sie die Farbe jedes Pixels lesen (und optional ändern).

Der RGBA-Array wird wie folgt angelegt:

// top-left pixel (x:0,y:0) 

data[0] red of pixel#0 (0-255) 
data[1] green of pixel#0 (0-255) 
data[2] blue of pixel#0 (0-255) 
data[3] alpha of pixel#0 (opacity: 0-255) 

// next pixel (x:1,y:0) 

data[4] red of pixel#1 
data[5] green of pixel#1 
data[6] blue of pixel#1 
data[7] alpha of pixel#1 

Sie können die R, G, B ändern oder eine Komponente eines jeden Pixels durch die Datenarray ändernden

Zum Beispiel dies ändert die oberen linken Pixel zu festen roten

data[0]=255; // red 
data[1]=0;  // green 
data[2]=0;  // blue 
data[3]=255; // alpha (opacity) 

über Transparenz:

Die Alpha-Komponente jedes Pixels bestimmt die Transparenz dieses Pixels.Wenn Sie nur meist undurchsichtigen Pixel ändern möchten, dann können Sie bequem alle halb-transparente Pixel wie diese ignorieren:

// alpha is 0-255 
// ignore pixels with alpha < 200 (ignore all pixels that are mostly semi-transparent) 

if(data[3]<200) { // don't process this pixel } 

Schließlich können Sie Ihre geänderte Pixel zurück auf die Leinwand schieben mit .putImageData

context.putImageData(imageData,0,0); 

Hinweis über die Demo

Es ist schwierig, „umfärben“ ein Bild, das Standard RGBA-Farbschema der Leinwand verwenden.

Also diese Demo konvertiert die RGB-Daten in das HSL-Farbschema. Dadurch kann die "Farbe" (Farbton) geändert werden, ohne die anderen Komponenten des Pixels zu beeinflussen (S = Sättigung der Farbe, L = Helligkeit der Farbe).

Nachdem das Pixel neu eingefärbt wurde, werden diese modifizierten HSL-Daten zurück in RGBA konvertiert und im Datenarray gespeichert.

+1

Dankeschön. Es ist eine ziemlich gute Lösung. Obwohl ich immer noch mit dem Problem kämpfe. Ich kenne die Farbe nicht, die ich im Bild ändern möchte. Ich möchte nur eine Farbe hinzufügen, die vom Benutzer an das Bild weitergegeben wird (das ist eine Mischung aus Originalbildfarbe + Farbe, die vom Benutzer übergeben wurde). –

+0

Ich habe ein neues Bild von Pille (Kapsel) hinzugefügt. Ich möchte seine Farbe ändern, die vom Benutzer in hexadezimaler Form übergeben wird. Jede Anleitung dazu wird großartig sein. Danke in Adv. –

+0

Nun, transparente Pixel haben einen Alpha-Wert nahe Null (vielleicht 0-10), also ändern Sie keine Pixel mit niedrigen Alpha-Werten. Ihr Pillenbild hat hellere und dunklere Farben. Wenn Sie den dunkleren Teil der Pille ändern wollen, dann zielen Sie auf Pixel mit niedrigeren RGB-Werten (niedrigere rgb-Werte == dunklere Farben). Wenn Sie den helleren Teil der Pille ändern wollen, dann zielen Sie auf Pixel mit höheren rgb-Werten. Wie in meiner Antwort sollten Sie die ausgewählten Pixel in HSL konvertieren und die Farbe der ausgewählten Pixel in die vom Benutzer übergebene Farbe verschieben. Auf diese Weise bleibt die Sättigung und Helligkeit des Bildes erhalten. – markE

Verwandte Themen