mysjkin Skrevet 4. januar 2010 Del Skrevet 4. januar 2010 Jeg har behov for å få et bilde til å scrolle nedover (prøver å lage et system som presenterer måledata over tid) Jeg har definert et BufferedImage bi og har prøvd med diverse varianter på bi.setData(=bi.getSubimage(0,0,w,h-diffheight).getRaster().createTranslatedChild(0,diffheight)) w= bredde, h= høyde, diffheight er antallet linjer jeg ønsker å scrolle ned bildet, med getSubimage(0,0,w,h-diffheight) mente jeg å få hele bildet unntatt de diffheight siste linjene, så flytter jeg det diffheight linjer nedover med createTranslatedChild(0,diffheight). Men resultatet blir at de diffheight første linjene av bildet blir gjentatt nedover bildet. ... Jeg lurer på om feilen er at jeg stadig har en peker inn det samme datasettet og har prøvd med å opprette et nytt objekt som inneholder de transponerte dataene, men med stadig samme resultat. Mulig at det er noe med hvordan objekter og pekere oppfører seg i java som jeg ikke har forstått... WritableRaster WR1=Raster.createWritableRaster(bi.getSampleModel(),null); WR1=bi.getSubimage(0,0,w,h-diffheight).getRaster(); bi.setData(WR1.createTranslatedChild(0,diffheight)); gir samme resultat.. Hele koden er her (basert på¨et eksempel fra javadokumentasjonen, bildet duke_skateboard.jpg ligger i jdk, evt finn et annet passende stort bilde. Den interessante koden er i metoden jumble() /* * Copyright © 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.imageio.*; import javax.swing.*; import java.util.Random; class JumbledImage extends Component { private int numlocs = 3; private int numcells = numlocs*numlocs; private int[] cells; private BufferedImage bi; int w, h, cw, ch,starth; public JumbledImage(URL imageSrc) { try { bi = ImageIO.read(imageSrc); w = bi.getWidth(null); h = bi.getHeight(null); starth=h; } catch (IOException e) { System.out.println("Image could not be read"); System.exit(1); } } void jumble() { //BufferedImage part; int diffheight=20; //Raster rast; WritableRaster WR1=Raster.createWritableRaster(bi.getSampleModel(),null); WritableRaster cut=Raster.createWritableRaster(bi.getSampleModel(),null); //rast = new Raster(w,h-diffheight); //part = new BufferedImage(h,w,BufferedImage.TYPE_INT_RGB); //cut=bi.getSubimage(0,h-diffheight,w,diffheight); WR1=bi.getSubimage(0,0,w,h-diffheight).getRaster(); //bi.setData(cut.createTranslatedChild(0,0)); bi.setData(WR1.createTranslatedChild(0,diffheight)); } public Dimension getPreferredSize() { return new Dimension(w, h); } public void paint(Graphics g) { g.drawImage(bi,10,10+starth-h,null); } } public class JumbledImageApplet extends JApplet { static String imageFileName = "duke_skateboard.jpg"; private URL imageSrc; private JumbledImage jumbledImage; private Label input_label; static JFrame f; public JumbledImageApplet () { } public JumbledImageApplet (URL imageSrc) { this.imageSrc = imageSrc; } public void init() { try { imageSrc = new URL(getCodeBase(), imageFileName); } catch (MalformedURLException e) { } buildUI(); } public void buildUI() { final JumbledImage ji = new JumbledImage(imageSrc); add("Center", ji); JButton jumbleButton = new JButton("Jumble"); jumbleButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); ji.jumble(); // JOptionPane.showMessageDialog(f,"--Jumbling--"); ji.repaint(); }; }); Dimension jumbleSize = ji.getPreferredSize(); resize(jumbleSize.width, jumbleSize.height+40); add("South", jumbleButton); } public static void main(String s[]) { f = new JFrame("Jumbled Image"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); URL imageSrc = null; try { imageSrc = ((new File(imageFileName)).toURI()).toURL(); } catch (MalformedURLException e) { } JumbledImageApplet jumbler = new JumbledImageApplet(imageSrc); jumbler.buildUI(); f.add("Center", jumbler); f.pack(); f.setVisible(true); } } Lenke til kommentar
mysjkin Skrevet 4. januar 2010 Forfatter Del Skrevet 4. januar 2010 Hmm, fikk til en løsning for det jeg trengte. I og med at radene kommer en og en, må jeg flytte ned bildet en pixelrad av gangen og det kan jeg gjøre med for (int i=0;i<w;i++) { for (int j=h-2;j>=0;j--){ bi.setRGB(i,j+1,bi.getRGB(i,j)); } } Om enn det virker litt vel eksplisitt, flytte hver eneste pixel en linje nedover... Men når dette fungerer, kan jeg se på resten - kommunikasjon med databasesystemet og den slags. - kommer sikkert tilbake med flere spørsmål etterhvert. (Jeg har allerede laget dette systemet i php + javascript, men må da for hver oppdatering rendre hele bildet på nytt, ikke helt effektivt, tror det kan fungere bedre med en frontend i java) M. Lenke til kommentar
Unlimited LTD Skrevet 4. januar 2010 Del Skrevet 4. januar 2010 Hm.. Her tror jeg nesten ikke at du trenger å gjøre annet enn å lage en BufferedImage som du flytter oppover hver gang: Opprett et bilde image1, som er tomt. Her skal dataene tegnes. Opprett et nytt bilde tempImage, like stort, tegn det gamle bildet på dette med drawImage(image1, -1, 0, this); Så tegner du nederst på tempImage de nye dataene, hvordan du nå gjør det. Så setter du image1 = tempImage. Tror det skal virke, uten at jeg har testet det da. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå