import 'dart:html'; import 'dart:typed_data'; class Pixed { static PixelArray greyscale(PixelArray image) { PixelArray pxArr = new PixelArray.fromPixelArray(image); for (var y = 0; y < pxArr.getHeight(); y++) { for (var x = 0; x < pxArr.getWidth(); x++) { var px = pxArr.getPixel(x, y); int average = ((px.r+px.g+px.b) / 3).round(); px.r = average; px.g = average; px.b = average; } } return pxArr; } } class Pixel { int x; int y; int r; int g; int b; int a; Pixel(this.x, this.y, this.r, this.g, this.b, this.a); int getBytePos(int imageWidth) { return (x+y*imageWidth)*4; } void setRGB(int r, int g, int b) { this.r = r; this.g = g; this.b = b; } @override String toString() { return 'Pixel at $x, $y: {r: $r, g: $g, b: $b, a: $a}'; } } class PixelArray { List> pixels; PixelArray(int width, int height) { pixels = new List.filled(height, new List(width)); } PixelArray.fromByteArray(Uint8ClampedList array, int imageWidth) { pixels = new List(array.length~/imageWidth~/4); int y = 0; int x = 0; pixels[y] = new List(imageWidth); print(pixels[0].length.toString() + ","+ pixels.length.toString()); for (var pos = 0; pos < array.length; pos = pos + 4) { if (x >= imageWidth) { x = 0; y++; pixels[y] = new List(imageWidth); } pixels[y][x] = new Pixel(x, y, array[pos], array[pos+1], array[pos+2], array[pos+3]); x++; } } PixelArray.fromImageData(ImageData imagedata, int imageWidth): this.fromByteArray(imagedata.data, imageWidth); PixelArray.fromPixelArray(PixelArray pixelArray) { pixels = new List>.from(pixelArray.pixels); } Uint8ClampedList toByteArray() { //TODO: look for longest array, or each line separately. Only gets width from line 1 currently. Uint8ClampedList result = new Uint8ClampedList(getHeight()*getWidth()*4); int x = 0; int y = 0; for (var i = 0; i < result.length; i = i + 4) { if (x >= getWidth()) { y++; x = 0; } result[i] = pixels[y][x].r; result[i+1] = pixels[y][x].g; result[i+2] = pixels[y][x].b; result[i+3] = pixels[y][x].a; x++; } return result; } ImageData toImageData() { return new ImageData(this.toByteArray(), this.getWidth(), this.getHeight()); } Pixel getPixel(int x, int y) { return pixels[y][x]; } void setPixel(Pixel pixel, [int x, int y]) { if (x != null && y != null && pixels[y] != null && pixels[y].length >= x) { pixel.x = x; pixel.y = y; pixels[y][x] = pixel; return; } else if (pixels.length < pixel.y || pixels[y].length < pixel.x) { return; } else { pixels[pixel.y][pixel.x] = pixel; return; } } int getWidth() { return pixels[0].length; } int getHeight() { return pixels.length; } }