Avatar billede svarejoergen Nybegynder
23. april 2013 - 14:42 Der er 15 kommentarer og
1 løsning

Hente og tegne billede fra jdbc database

Jeg forsøger at få mit program til at arbejde sammen med en database.
Har lavet denne metode til at gemme billederne på min database og den virker perfekt.

**************

      public void gemBillede(String a, int b)//a navn og b sæde
      {
                    EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
          Gtspiller fis = em.find(Gtspiller.class, b);//
         
  File image = new File("D:\\portræt\\"+a+".gif");

  fis.setBillede(image);
      em.getTransaction().commit();
  em.close();
      }

****************

Problemet er når jeg vil hente og bruge billedet igen. Kan ikke finde ud af at jonglere rundt med billedet når det findes i "serializable" eller "object" form. metoderne getBillede og setBillede er i en entity klasse som netbeans har genereret for mig udfra min database.

Her er min givBillede klasse indtil videre.
Ved ikke om den kan bruges til noget. Virker som om den returnerer noget i Object form.

*************************
      public Object givBillede(int a)
      {
  EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
        Gtspiller fi = em.find(Gtspiller.class, a); 
  em.close();
 
  return fi.getBillede();
      }
***************************

I tegnBilleder metoden(I grafik klassen) tegner jeg på nuværende tidpunkt bare billeder som ligger i en folder. Her har jeg brug for at kunne kalde givBillede og hente billedet fra databasen.

**************************
        public void tegnBilleder()
                {
     
        pic1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(0).getnavn()+".GIF"))); //
        pic2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(1).getnavn()+".GIF"))); //
        pic3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(2).getnavn()+".GIF"))); //
        pic4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(3).getnavn()+".GIF"))); //
        pic5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(4).getnavn()+".GIF"))); //
        pic6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(5).getnavn()+".GIF"))); //
        pic7.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(6).getnavn()+".GIF"))); //
        pic8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(7).getnavn()+".GIF"))); //
        pic9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(8).getnavn()+".GIF"))); //
        pic10.setIcon(new javax.swing.ImageIcon(getClass().getResource("/billeder/"+t.getspiller(9).getnavn()+".GIF"))); //
        }
Avatar billede skofree2838 Nybegynder
23. april 2013 - 14:48 #1
SPAM fjernet

Dette indlæg er blevet modereret af en CoAdmin

Avatar billede svarejoergen Nybegynder
23. april 2013 - 21:55 #2
Sidder stadig og roder med problemet.

Bliver lige pludselig i tvivl om gemBillede metoden virker som jeg regner med.

Kan godt få den oprindelige adresse på billedet dvs D/portræt/billedenavn

Er i tvivl om den overhovedet gemmer selve billedet.

Har virkelig brug for noget hjælp til forståelsen af dette.
Avatar billede arne_v Ekspert
24. april 2013 - 00:02 #3
Umiddelbart ser det ud som at du gemmer File object og ikke et byte[] objekt med indhold fra filen.
Avatar billede arne_v Ekspert
24. april 2013 - 00:02 #4
Du skal gemme og hente et byte[].
Avatar billede svarejoergen Nybegynder
24. april 2013 - 16:24 #5
Er fuldstændig lost.
Har fundet ud af at jeg kun gemmer filen dvs adressen og ikke selve billedet.

Ved ikke om dette link kan bruges til noget?
http://www.gamedev.net/topic/522831-serialized-images/

Dette er hvad jeg har forsøgt. Er forvirret på et højere plan

**********************************************************

      public static byte[] imageToByteArray(BufferedImage image) throws IOException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(image, "gif", baos);
    return baos.toByteArray();
}
      public static BufferedImage byteArrayToImage(byte[] imageArray) throws IOException
{
    return ImageIO.read(new ByteArrayInputStream(imageArray));
}
      public void gembillede(String a, int b) throws IOException//a navn og b sæde
      {
  EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
          Gtspiller dyr = em.find(Gtspiller.class, b);//! +1? dødtræt
   
  File fi = new File("D:\\portræt\\"+a+".gif");

  Image image = ImageIO.read(fi); 
BufferedImage buffered = (BufferedImage) image; 
  byte[] content = new byte[(int)fi.length()];
 
  ByteArrayInputStream stream = new ByteArrayInputStream(content);
 
  //Blob golp = null;
  dyr.setBillede(fi);
 
      em.getTransaction().commit();
  em.close();
      }
      public Object givbillede(int a)
      {
  EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
        Gtspiller fi = em.find(Gtspiller.class, a);
  em.close();
 
  return fi.getBillede();
      }

********************************************************

Er der overhovedet noget brugbart ?
Avatar billede svarejoergen Nybegynder
24. april 2013 - 16:27 #6
Linien
dyr.setBillede(fi);

vil jo kun tage serialized. dvs ikke nogen af de andre image, buffered imge etc
Avatar billede svarejoergen Nybegynder
24. april 2013 - 21:00 #7
Med andre ord.

Jeg mangler en metode der opdaterer BLOB kolonnen i min database med et .gif billede.

Her er metoden jeg bruger for at opdatere stack kolonnen, hvilket er en double. Denne metode fungerer. Har bare brug for at kunne gøre det samme med et billede, således at selve billedet gemmes og ikke bare en adresse.

****************

public void updateStack(int a, double b)//spiller a stack sættes til beløbet b
{
    EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
  Gtspiller dyr = em.find(Gtspiller.class, a);
  dyr.setStack(b);
  em.getTransaction().commit();
  em.close();
}
Avatar billede arne_v Ekspert
25. april 2013 - 03:43 #8
GtSpiller klassen skal have et field billede af typen byte[].

setBillede metode skal tage et argment af typen byte[].

Og du skal kalde den med content (som er byte[]).
Avatar billede svarejoergen Nybegynder
25. april 2013 - 22:39 #9
Jeg forsøger at arbejde videre på det.

Håber jeg finder en løsning her i weekenden. Vender tilbage.

Tak for hjælpen indtil videre :)
Avatar billede svarejoergen Nybegynder
02. maj 2013 - 16:09 #10
Jeg har ikke glemt tråden.
Fandt ikke en løsning. Arbejder videre på problemet mandag, og vender tilbage i løbet af ugen, ligemeget om jeg får det til at virke eller ej.
Avatar billede arne_v Ekspert
03. maj 2013 - 02:02 #11
At gemme og hente byte[] i database er noget helt standard, saa det boer du kunne faa til at virke.
Avatar billede svarejoergen Nybegynder
10. maj 2013 - 21:06 #12
Kan desværre ikke få det til at virke. Dette er hvad jeg har på nuværende tidpunkt. Har nok forsøgt ca 30 timer sammenlagt.
Den smider IOException. Har endnu ikke lykkedes med at gemme mere en stien til et billede.

Hvis nogen har et link der forklarer det for dummies som mig. Eller hvad som helst som kan hjælpe mig videre vil jeg blive meget glad.

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                     
     
            File fi = new File("D:\\portræt\\"+"abe"+".gif");
            System.out.print(fi.isDirectory());//giver false !!

try{
byte[] content = Files.readAllBytes(fi.toPath());
System.out.print(content.length);
t.updatebillede(1,content);
}
catch (IOException ex){System.out.print("IOException");


    }


  public void updatebillede(int a, byte[] b)//
{
      System.out.print(" kom nu ");
    EntityManagerFactory  factory = Persistence.createEntityManagerFactory("Contact DB");
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
  Gtspiller dyr = em.find(Gtspiller.class, a);
  dyr.setBillede(b);
  em.getTransaction().commit();
  em.close();
}
Avatar billede arne_v Ekspert
11. maj 2013 - 23:12 #13
Jeg maa proeve og lave et eksempel.
Avatar billede arne_v Ekspert
12. maj 2013 - 02:51 #14
Det virkede hos mig i foerste forsoeg.


package jpablob;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/*
* CREATE TABLE picture (id INTEGER NOT NULL, image BLOB, PRIMARY KEY(id));
*/
@Entity
@Table(name="picture")
public class Picture {
    private int id;
    private byte[] image;
    @Id
    @Column(name="id")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(name="image")
    public byte[] getImage() {
        return image;
    }
    public void setImage(byte[] image) {
        this.image = image;
    }
}



<persistence xmlns="http://java.sun.com/xml/ns/persistence"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
            version="2.0">
  <persistence-unit name="test">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <class>jpablob.Picture</class>
      <exclude-unlisted-classes/>
      <properties>
        <!--<property name="show_sql">true</property>-->
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost/Test"/>
        <property name="hibernate.connection.username" value=""/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.connection.pool_size" value="5"/>
      </properties>
  </persistence-unit>
</persistence>



package jpablob;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class TestSave {
    public static void main(String[] args) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
        EntityManager em = factory.createEntityManager();
        Picture p = new Picture();
        p.setId(1);
        p.setImage(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
        em.getTransaction().begin();
        em.persist(p);
        em.getTransaction().commit();
        em.close();
    }
}



package jpablob;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class TestLoad {
    public static void main(String[] args) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
        EntityManager em = factory.createEntityManager();
        Picture p = em.find(Picture.class, 1);
        em.close();
        System.out.println(p.getId());
        for(byte b : p.getImage()) {
            System.out.print(" " + b);
        }
        System.out.println();
    }
}
Avatar billede svarejoergen Nybegynder
12. maj 2013 - 10:43 #15
Fantastisk. Mange tak. Smid et svar
Avatar billede arne_v Ekspert
12. maj 2013 - 15:40 #16
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester