Skip to content

Instantly share code, notes, and snippets.

@hageldave
Last active December 22, 2016 23:46
Show Gist options
  • Save hageldave/19b4b75dff3bfac267dfe5b3aebc67b2 to your computer and use it in GitHub Desktop.
Save hageldave/19b4b75dff3bfac267dfe5b3aebc67b2 to your computer and use it in GitHub Desktop.
convert pixel to anything else e.g float[] and stream it
public static void main(String[] args) {
Img img = new Img(200,200);
img.fill(0xff000000);
Spliterator<float[]> split = new ConvertedPixelSpliterator<>(
img.spliterator(),
()->{return new float[6];},
testmain::pixel2vec,
testmain::vec2Pixel);
StreamSupport.stream(split, true)
.forEach(vec -> {
float x = vec[4];
float y = vec[5];
float r = vec[2];
float g = vec[1];
float b = vec[0];
r = x;
g = y;
b = 1;
vec[2] = r;
vec[1] = g;
vec[0] = b;
});
ImageSaver.saveImage(img.getRemoteBufferedImage(), "blah.png");
}
static class ConvertedPixelSpliterator<T> implements Spliterator<T> {
Spliterator<Pixel> delegate;
T element;
Supplier<T> elementInitializer;
BiConsumer<Pixel, T> fromPixelConverter;
BiConsumer<T, Pixel> toPixelConverter;
public ConvertedPixelSpliterator(Spliterator<Pixel> delegate, Supplier<T> elementInitializer, BiConsumer<Pixel, T> fromPixelConverter, BiConsumer<T, Pixel> toPixelConverter) {
this.delegate=delegate;
this.element = elementInitializer.get();
this.elementInitializer = elementInitializer;
this.fromPixelConverter = fromPixelConverter;
this.toPixelConverter = toPixelConverter;
}
@Override
public boolean tryAdvance(Consumer<? super T> action) {
return delegate.tryAdvance( px -> {
fromPixelConverter.accept(px, element);
action.accept(element);
toPixelConverter.accept(element, px);
});
}
@Override
public void forEachRemaining(Consumer<? super T> action) {
delegate.forEachRemaining(px -> {
fromPixelConverter.accept(px, element);
action.accept(element);
toPixelConverter.accept(element, px);
});
}
@Override
public Spliterator<T> trySplit() {
Spliterator<Pixel> del = delegate.trySplit();
return del == null ? null:new ConvertedPixelSpliterator<T>(del, elementInitializer, fromPixelConverter, toPixelConverter);
}
@Override
public long estimateSize() {
return delegate.estimateSize();
}
@Override
public int characteristics() {
return delegate.characteristics();
}
}
static void pixel2vec(Pixel px, float[] vec){
vec[0] = px.b_normalized();
vec[1] = px.g_normalized();
vec[2] = px.r_normalized();
vec[3] = px.a_normalized();
vec[4] = px.getXnormalized();
vec[5] = px.getYnormalized();
}
static void vec2Pixel(float[] vec, Pixel px){
px.setARGB_fromNormalized(vec[3], vec[2], vec[1], vec[0]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment