Вход Регистрация
Файл: Space race/bkcore/ImageData.js
Строк: 102
<?php
/*!
 * @class bkcore.ImageData
 *
 * Loads an image and gives access to pixel data.
 * 
 * @author Thibaut 'BKcore' Despoulain <http://bkcore.com>
 */

/*!
 * @package bkcore
 */
var bkcore = bkcore || {};

/*!
 * Creates a new ImageData object
 * 
 * @param path String The path of the image
 * @param callback Function A callback function to be called once th eimage is loaded
 */
bkcore.ImageData = function(path, callback)
{
    var 
self = this;

    
this.image = new Image();
    
this.pixels = null;
    
this.canvas = null;
    
this.loaded = false;

    
this.image.onload = function() {
        
self.canvas = document.createElement('canvas');
        
self.canvas.width = self.image.width;
        
self.canvas.height = self.image.height;

        var 
context = self.canvas.getContext('2d');
        
context.drawImage(self.image, 0, 0);

        
self.pixels = context.getImageData(0, 0, self.canvas.width, self.canvas.height);

        
self.loaded = true;

        
context = null;
        
self.canvas = null;
        
self.image = null;

        if(
callback) callback.call(self);        
    };
    
this.image.crossOrigin = "anonymous";
    
this.image.src = path;
};

/*!
 * Gets pixel RGBA data at given index
 * 
 * @param x int In pixels
 * @param y int In pixels
 * @return Object{r,g,b,a}
 */
bkcore.ImageData.prototype.getPixel = function(x, y)
{
    if(
this.pixels == null
        
|| x < 0
        
|| y < 0
        
|| x >= this.pixels.width
        
|| y >= this.pixels.height)
        return {
r: 0, g: 0, b: 0, a:0};

    var 
index = (y*this.pixels.width + x) * 4;

    return {
        
r: this.pixels.data[index],
        
g: this.pixels.data[index + 1],
        
b: this.pixels.data[index + 2],
        
a: this.pixels.data[index + 3]
    };
};

/*!
 * Gets pixel RGBA data at given float index using bilinear interpolation
 * 
 * @param x float In subpixels
 * @param y float In subpixels
 * @return Object{r,g,b,a}
 */
bkcore.ImageData.prototype.getPixelBilinear = function(fx, fy)
{
    var 
x = Math.floor(fx);
    var 
y = Math.floor(fy);
    var 
rx = fx - x - .5;
    var 
ry = fy - y - .5;
    var 
ax = Math.abs(rx);
    var 
ay = Math.abs(ry);
    var 
c, cxy, cx, cy, cf1, cf2;
    var 
dx = rx < 0 ?  -1 : 1;
    var 
dy = ry < 0 ? -1 : 1;
    
    
c = this.getPixel(x, y);
    
cx = this.getPixel(x+dx, y);
    
cy = this.getPixel(x, y+dy);
    
cxy = this.getPixel(x+dx, y+dy);

    
cf1 = [
        (
1-ax) * c.r + ax * cx.r,
        (
1-ax) * c.g + ax * cx.g,
        (
1-ax) * c.b + ax * cx.b,
        (
1-ax) * c.a + ax * cx.a
    
];

    
cf2 = [
        (
1-ax) * cy.r + ax * cxy.r,
        (
1-ax) * cy.g + ax * cxy.g,
        (
1-ax) * cy.b + ax * cxy.b,
        (
1-ax) * cy.a + ax * cxy.a
    
];
    
    return {
        
r: (1-ay) * cf1[0] + ay * cf2[0],
        
g: (1-ay) * cf1[1] + ay * cf2[1],
        
b: (1-ay) * cf1[2] + ay * cf2[2],
        
a: (1-ay) * cf1[3] + ay * cf2[3]
    };
}

/*!
 * Gets pixel data at given index 
 * as 3-bytes integer (for floating-point textures erzats, from RGB values)
 * 
 * @param x int In pixels
 * @param y int In pixels
 * @return int (R + G*255 + B*255*255)
 */
bkcore.ImageData.prototype.getPixelF = function(x, y)  
{ 
    var 
color = this.getPixel(x, y);
    return 
color.r + color.g * 255 + color.b * 255 * 255; 
};

/*!
 * Gets pixel data at given float index using bilinear interpolationas
 * as 3-bytes integer (for floating-point textures erzats, from RGB values)
 * 
 * @param x float In subpixels
 * @param y float In subpixels
 * @return Object{r,g,b,a}
 */
bkcore.ImageData.prototype.getPixelFBilinear = function(fx, fy)
{
    var 
color = this.getPixelBilinear(fx, fy);
    return 
color.r + color.g * 255.0 + color.b * 255.0 * 255.0; 
}
?>
Онлайн: 0
Реклама