Hi,
ich möchte gerne die Pixel eines BufferedImages direkt manipulieren. Das bekomme ich prinzipiell auch hin, aber leider ist das total inperformant (300ms für ein 400*400 Bild). Ich poste einfach mal den Code den ich verwendet habe vielleicht kennt ja einer von euch einen performanteren Weg.
ich möchte gerne die Pixel eines BufferedImages direkt manipulieren. Das bekomme ich prinzipiell auch hin, aber leider ist das total inperformant (300ms für ein 400*400 Bild). Ich poste einfach mal den Code den ich verwendet habe vielleicht kennt ja einer von euch einen performanteren Weg.
Code:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.SinglePixelPackedSampleModel;
import java.awt.image.WritableRaster;
import javax.swing.JFrame;
public class PixelMaupulatorTest {
static JFrame f ;
static BufferedImage buffer;
public static void main(String[] args) {
f = new JFrame();
f.setPreferredSize(new Dimension(400,400));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setResizable(false);
f.setIgnoreRepaint(true);
f.pack();
f.setVisible(true);
Graphics graphics = f.getGraphics();
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
GraphicsConfiguration conf = device.getDefaultConfiguration();
buffer = conf.createCompatibleImage(400, 400);
Thread t = new Thread(new Runnable(){
public void run() {
while(true){
doRender((Graphics2D)f.getGraphics());
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
}
/**
* Test für verschienend Möglichkeiten des manipulierens einzelner Pixel
* @param s
*/
private static void doRender(Graphics2D s) {
WritableRaster raster = buffer.getRaster();
DataBuffer dataBuffer = raster.getDataBuffer();
//doSetPixelInRaster(raster);
//doSetPixelInSampleModel(raster, dataBuffer);
doSetPixelInDataBuffer(dataBuffer);
//Image Zeichnen
s.drawImage(buffer, f.getInsets().left,f.getInsets().top,null);
}
/**
* DataBuffer Manipulieren
* @param dataBuffer
*/
private static void doSetPixelInDataBuffer(DataBuffer dataBuffer) {
long cr = System.currentTimeMillis();
for(int r = 0 ; r < 400*400; r++){
dataBuffer.setElem(r, r);
}
System.out.println(System.currentTimeMillis() -cr);
}
/**
* SampleModel Manipulieren
* @param raster
* @param dataBuffer
*/
private static void doSetPixelInSampleModel(WritableRaster raster,
DataBuffer dataBuffer) {
long cr = System.currentTimeMillis();
SinglePixelPackedSampleModel sampleModel = (SinglePixelPackedSampleModel)raster.getSampleModel();
for(int x=0; x<400;x++){
for(int y=0; y<400;y++){
sampleModel.setPixel(x, y, new int[]{x,y,10*(int)Math.random()},dataBuffer);
}
}
System.out.println(System.currentTimeMillis() -cr);
}
/**
* Raster Manipulieren
* @param raster
*/
private static void doSetPixelInRaster(WritableRaster raster) {
long cm = System.currentTimeMillis();
for(int x=0; x<400;x++){
for(int y=0; y<400;y++){
raster.setPixel(x, y, new int[]{x,y,10*(int)Math.random()});
}
}
System.out.println(System.currentTimeMillis() -cm);
}
}