2011-12-07 53 views
6

Cái gì đó có thể làm điều gì đó nhưCó thư viện js nào có thể tạo bảng màu từ hình ảnh không?

<img class="image" ... /> 

$(".image").get_colors() 

Tôi biết có vài trang web nơi bạn có thể tải lên hình ảnh của bạn và nó sẽ tạo ra các màu sắc cho bạn, nhưng tôi muốn một cái gì đó để đưa vào trang web của tôi

Cái gì đó như this nơi bạn thấy các màu được tạo từ ảnh chụp màn hình và có thể tìm kiếm theo màu sắc. Tôi đã cố gắng để kiểm tra mã nguồn nhưng tôi không thể nhìn thấy bất kỳ tham chiếu đến một thư viện js.

Tôi cần tính năng này để hoạt động với j nếu có thể.

CHỈNH SỬA: Hình ảnh sẽ có trên trang; Tôi chỉ cần tạo màu của nó, vì vậy tôi không muốn các tính năng tải lên.

Cảm ơn.

+1

Không Không, không tải lên. Chỉ cần lấy màu khỏi hình ảnh trong trang – aurel

+0

Chỉ cần vẽ hình ảnh trên phần tử canvas và tự kiểm tra. Không biết những gì bạn mong đợi là sự trở lại của 'get_colors'. – Prusse

+0

Chưa từng sử dụng canvas trước đây (tôi đã bắt đầu xem html5) vì vậy Im sẽ thử xem - Bạn có biết bất kỳ tài nguyên nào có thể bao gồm hiệu ứng bạn đang nói về @Prusse – aurel

Trả lời

6

Bạn có thể quan tâm đến this related questionmy answer to another one.

Nhận tất cả màu từ hình ảnh đơn giản, ít nhất trong trình duyệt hỗ trợ phần tử canvas - kỹ thuật là described here. Bạn kết thúc bằng một số CanvasPixelArray (described here), về cơ bản là một mảng như [r,g,b,a,r,g,b,a, ...] trong đó r,g,b,a là các byte cho biết giá trị màu đỏ, xanh lục, xanh dương và alpha của mỗi pixel.

Phần khó xác định hoặc tạo ra một lựa chọn nhỏ màu đại diện, thay vì 10.000 màu có thể có trong hình ảnh 100x100. Đây là một vấn đề khá phức tạp, với nhiều giải pháp (overview here). Bạn có thể thấy việc triển khai Javascript của hai thuật toán có thể có trong clusterfck librarymy port of the Leptonica Modified Median Cut algorithm.

+0

Đây là câu trả lời chuyên nghiệp duy nhất cho câu hỏi này . Cảm ơn ngài! – andreapier

2

Tôi đã viết chỉ để giải trí. Nó là một plugin jquery, nếu bạn không sử dụng nó, bạn có thể đọc nó cho một số gợi ý. Nếu có một số lỗi trong khi gọi tới get_colors một mảng được đặt trong giá trị trả về để giữ lỗi, nó trả về một mảng đối tượng, các đối tượng này là biểu đồ của hình ảnh (một mục trong mảng cho mọi phần tử đã chọn).

(function($, window, document, undefined){ 
    var canvas = document.createElement('canvas'); 
    if (canvas && canvas.getContext){ 
     $.fn.get_colors = function(){ 
      var rv = []; 
      this.each(function(){ 
       var tagname = this.tagName.toLowerCase(); 
       if ((tagname === 'img') || (tagname === 'canvas') || (tagname === 'video')){ 
        //something bad can happend when drawing the image 
        try{ 
         var w = this.getAttribute('width'); 
         var h = this.getAttribute('height'); 
         canvas.setAttribute('width', w); 
         canvas.setAttribute('height', h); 
         var ctxt = canvas.getContext('2d'); 
         if (ctxt){ 
          ctxt.drawImage(this, 0, 0); 
          var imagedata = ctxt.getImageData(0, 0, w, h); 
          var data = imagedata.data; 
          //log('imagedata.width:'+imagedata.width+' imagedata.height:'+imagedata.height+' w:'+w+' h:'+h); 
          var obj = {}; 
          var color = ''; 
          var r = 0, g = 0, b = 0, a = 0; 
          var pix = data.length; 
          for (pix--; pix > 2; pix-=4){ 
           //a = data[pix - 0]; 
           b = data[pix - 1]; 
           g = data[pix - 2]; 
           r = data[pix - 3]; 
           if (r < 16) r = '0' + r.toString(16); 
           else r = r.toString(16); 
           if (g < 16) g = '0' + g.toString(16); 
           else g = g.toString(16); 
           if (b < 16) b = '0' + b.toString(16); 
           else b = b.toString(16); 
           //if (a < 16) a = '0' + r.toString(16); 
           //else a = a.toString(16); 
           //color = r + g + b + a; 
           color = r + g + b; 
           if (obj[color] > 0) ++obj[color]; 
           else obj[color] = 1; 
          } 
          rv.push(obj); 
          imagedata = data = obj = null; 
         } 
         ctxt = null; 
        } catch(error){ 
         if (!rv.errors){ 
          rv.errors = []; 
         } 
         rv.errors.push(error); 
        } 
       } 
      }); 
      return rv; 
     }; 
    } else{ 
     $.fn.get_colors = function(){ 
      throw new Error('canvas element support required!'); 
     }; 
    } 
})(jQuery, this, this.document); 

Nếu một tài liệu với chỉ một hình ảnh với 4 pixel (2x2) "# ff0000, # 00FF00, # 0000FF, # ff0000", nếu bạn làm $('img').get_colors(); nó trả [{"ff0000": 2, "0000ff": 1, "00ff00":1}].

Để tìm hiểu cách sử dụng phần tử canvas bạn có thể xem MDN và tại số specs để phát triển chi tiết về thao tác pixel.

Chỉnh sửa: đã nhận xét một dòng tôi đang sử dụng khi gỡ lỗi.

1

Bạn đã xem dự án này trên Github chưa?

http://lokeshdhakar.com/projects/color-thief/

Đó là giải pháp javascript. (Nó phụ thuộc vào hai thư viện bổ sung: jquery, quantize.js).

var colorThief = new ColorThief(); 
colorThief.getPalette(sourceImage, 8); 
getPalette(sourceImage[, colorCount, quality]) 

Sẽ trả về một mảng, như sau: [[num, num, num], [num, num, num], ...]

Các vấn đề liên quan