Ok, pierwszy krok, zamiast używać formatu jpeg, użyjesz PNG, dzięki czemu możesz mieć przezroczyste obszary na obrazie.
Otwórz go w edytorze obrazów i wyciąć wszystkie puste obszary na obrazie, pozostawiając kubek przezroczystym konturem. Tak:
Nie zamierzamy użyć jQuery tutaj, bo szczerze nie wiem nic o tym, więc nie mogę pomóc, że zamiast będziemy używać bezpośrednio API płótno z HTML 5 (oznacza to, że twoja aplikacja nie będzie działać na starszych przeglądarkach)
Tutaj wykonamy mnożenie kolorów na piksel, ponieważ Twój kubek jest w skali szarości, która zrobi to za nas.
Wybierzmy tablicę zawierającą wszystkie informacje o kolorach pikseli.
- Dodaj obraz do DOM
- Załóż OffScreen elementu canvas
- Poczekaj na zdjęcie, aby załadować
- narysować obraz na płótnie
uzyskać dane pikseli przy użyciu getImagedata
metoda wewnątrz zdarzenia onload obrazu
< * img src = "kubek.PNG”id = "kubek" szerokość = "25%" wysokość = "25%" onload = "getPixels()" w />
var mug = document.getElementById("mug");
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var originalPixels = null;
var currentPixels = null;
function getPixels(img)
{
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, img.width, img.height);
originalPixels = ctx.getImageData(0, 0, img.width, img.height);
currentPixels = ctx.getImageData(0, 0, img.width, img.height);
img.onload = null;
}
Musimy koloru z próbnika być w format RGB, a nie hex, więc korzystać z tej funkcji w przypadku, gdy zbieracz zwraca wartość szesnastkową aby przekształcić go:
function hexToRGB(hex)
{
var long = parseInt(hex.replace(/^#/, ""), 16);
return {
R: (long >>> 16) & 0xff,
G: (long >>> 8) & 0xff,
B: long & 0xff
};
}
teraz tutaj jest magia część, niech pętlę poprzez danych pikseli i pomnożyć ją do koloru z próbnik kolorów:
na mój skrypt nie ma wyboru koloru, właśnie stworzył prostą metodę wprowadzania tekstu, aby wpisać w kolorze szesnastkowym, funkcja ta poniżej jest zdarzenie OnClick przycisku wejściowego
function changeColor()
{
if(!originalPixels) return; // Check if image has loaded
var newColor = hexToRGB(document.getElementById("color").value);
for(var I = 0, L = originalPixels.data.length; I < L; I += 4)
{
if(currentPixels.data[I + 3] > 0) // If it's not a transparent pixel
{
currentPixels.data[I] = originalPixels.data[I]/255 * newColor.R;
currentPixels.data[I + 1] = originalPixels.data[I + 1]/255 * newColor.G;
currentPixels.data[I + 2] = originalPixels.data[I + 2]/255 * newColor.B;
}
}
ctx.putImageData(currentPixels, 0, 0);
mug.src = canvas.toDataURL("image/png");
}
widać, sztuką jest:
- Get oryginalnego koloru piksela
- przekształcić go z zakresu 0-255 do 0-1
- pomnożyć ją do nowego koloru, który chcesz go mieć.
Można go zobaczyć tu pracuje: http://users7.jabry.com/overlord/mug.html
Jestem pewien, że działa przynajmniej na Firefox i Chrome.
Kontur kubka nie wygląda dobrze, ponieważ właśnie zrobiłem szybką "magiczną różdżkę" na Photoshopie, możesz zrobić coś lepszego później.
Czy możesz pokazać nam plik obrazu? W zależności od jego złożoności może być możliwe uzyskanie dobrych wyników przy użyciu płótna. – Delta
@Delta dzięki za odpowiedź. Próbowałem przesłać obraz, ale stackoverflow.com nie pozwolił mi ... powiedział, że potrzebuję więcej niż 10 reputacji. Jednak przesłałem obraz do tinypic. Oto link http://i42.tinypic.com/20zz140.jpg :) jeszcze raz dziękuję –
@Delta. Dałem ci do myślenia link do mojego obrazu. Czy myślisz, że użycie "Canvas" zrobi dla mnie dobrą robotę. Ponieważ jak widzisz, kolor mojego kubka jest biały .. jeśli jakikolwiek użytkownik użyje próbnika kolorów i wybierze czerwony kolor, a następnie zmieniając umysł natychmiast wybierze żółty .. kolor kubka zmieni się na żółty + czerwony. Nie zastąpi czerwieni kolorem żółtym. Proszę, popraw mnie jeśli się mylę. dzięki :) –