Last active
December 22, 2016 23:46
-
-
Save hageldave/19b4b75dff3bfac267dfe5b3aebc67b2 to your computer and use it in GitHub Desktop.
convert pixel to anything else e.g float[] and stream it
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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