Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 22:02

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pixel setzen in Java
BeitragVerfasst: So Jan 21, 2007 13:52 
Offline
DGL Member
Benutzeravatar

Registriert: So Feb 06, 2005 17:29
Beiträge: 187
Programmiersprache: C, C++
Hi,
ich hab mich jetzt mal an dem schicken Tutorial von Nico zum Thema Raytracing versucht und bin jetzt soweit am Ende des ersten Tuts angelangt, dass ich einmal die Tiefeninformationen rendern moechte.
Das Problem ist, dass ich das ganze in Java gemacht habe (weil wir das gerade in der Schule lernen und soo anders als pascal ist es nun auch nicht), aber ich kenne mich leider noch nicht allzu gut damit aus. Ich hab jetzt mit swing ein fenster (JFrame) und suche nun eigentlich so etwas wie das Canvas-Objekt in Delphi um einzelnen Pixeln bestimmte RGB-Farbwerte zuzuordnen.
Gibts da so etwas, oder wenn nicht, wie macht man es dann?

Ich hab beim googlen irgendwie nix gefunden und bevor ich in einem Java-Forum frage, frag ich einfach mal hier die Javaleute ...
:roll:
:wink:

_________________
Flummi: Projektseite und Projektthread


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 21, 2007 16:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Naja, ein Canvas Objekt gibt es da auch.
Innerhalb deiner Fensterklasse muss du die Paint Methode überschreiben und dann deinen eigenen Stuff mit hinzuschreiben.
Innerhalb der Paint Methode hast du dann alle Methoden von Graphics und 2DGraphics zur Verfügung. 2DGraphics hast du erst nach einem entsprechenden Typecast.

Ich würd das ganze allerdings nicht mit Swing machen, das wird noch langsamer als mit OGL.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 21, 2007 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Um die Geschwindigkeit des Pixel zeichnens würde ich mir persönlich keine sorgen machen. Viel viel länger dauert es für gewöhnlich die Farbe des Pixels zu ermitteln.

Wenn dir die GUI nicht wichtig ist könntest du das Bild auch gleich in einer Datei (z.B. TGA) speichern. (Zum Aufbau des TGA Formates ist dieser Artikel vermutlich ganz hilfreich: Screenshot)

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 22, 2007 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Hier sonst ne entsprechende Java Klasse in Verbindung mit LWJGL

Auf unvollständigkeit übernehme ich keine Haftung. Generell funktioniert das TGA Laden. Die FUnktionen der TextureLoader Klasse kann ich bei Bedarf auch posten.
Code:
  1.  
  2. /* =============================================================================
  3.  * TGATextureLoader.java Bubble EngineOld
  4.  * Copyright (c) 2004 - 2005 Benjamin "Evil-Devil" Behrendt
  5.  * All rights reserved
  6.  * -----------------------------------------------------------------------------
  7.  * powered by LWJGL - Copyright (c) LWJGL Team (http://www.lwjgl.org)
  8.  * powered by JAVA - Copyright (c) Sun Microsystems (http://java.sun.com)
  9.  * -------------------------------------------------------------------------- */
  10. package com.evildevil.bubble.core.texture;
  11.  
  12. //JAVA Imports
  13. import java.io.File;
  14. import java.nio.ByteBuffer;
  15. import java.nio.IntBuffer;
  16. import java.util.Arrays;
  17.  
  18. import com.evildevil.bubble.core.LogManager;
  19. import com.evildevil.bubble.util.BufferUtils;
  20.  
  21. /**
  22.  * @author Benjamin "Evil-Devil" Behrendt
  23.  * @version 1.1, 25.03.2006
  24.  */
  25. public final class TGATextureLoader extends TextureLoader {    
  26.     private byte[] uncompressedTGAHeader = new byte[] {            
  27.             0,0,2,0,0,0,0,0,0,0,0,0 };              // header of uncompressed tga image
  28.     private byte[] compressedTGAHeader = new byte[] {            
  29.             0,0,10,0,0,0,0,0,0,0,0,0 };             // header of compressed tga image
  30.     private byte[] compareTGAHeader = new byte[12]; // to check if we really have a tga image
  31.     private byte[] tgaHeader = new byte[6];         // only the first 6 bytes are usefull for us
  32.    
  33.     private byte[] colorBuffer;         // used for RLE compression
  34.     private byte[] textureData;         // will store the TGA Image data    
  35.    
  36.     public TGATextureLoader() {            
  37.     }
  38.    
  39.     public Texture loadTexture(String  textureName) throws TextureFormatException {
  40.         // call TextureLoader::loadTexture to ensure everything went ok!
  41.         super.loadTexture(textureName);
  42.        
  43.         // determine if it is an compressed or uncompressed tga image
  44.         compareTGAHeader = getRawHeader(compareTGAHeader.length);        
  45.        
  46.         // load the image corresponding to be compressed or not        
  47.         try {
  48.             if (Arrays.equals(compareTGAHeader,uncompressedTGAHeader))  // load uncompressed TGA
  49.                 loadUncompressedTexture(textureName);
  50.             else if (Arrays.equals(compareTGAHeader,compressedTGAHeader)) { // load compressed TGA
  51.                 loadCompressedTexture(textureName);
  52.             } else  // none TGA -> throw new TGA exception
  53.                 throw new TGAFormatException("texture \""+textureName+"\" is no tga image");
  54.         } catch (TGAFormatException tgafe) {
  55.             throw tgafe;        // rethrow the exception
  56.         }                
  57.         return texture;
  58.     }
  59.    
  60.     /*
  61.      * @see com.evildevil.bubble.core.texture.ITextureLoad#loadUncompressedTexture(java.lang.String)
  62.      * Fixed: 25.03.2006 got the RLE encoding working.
  63.      */
  64.     public int loadUncompressedTexture(String textureName) throws TGAFormatException {
  65.         LogManager.log("Attempting to load a uncompressed TGA Image.");
  66.         texture = new Texture();
  67.         textureFile = new File(textureName);
  68.         try {
  69.             // get the real header ^^
  70.             tgaHeader = getHeader(tgaHeader.length);
  71.             // get the texture format
  72.             getTextureFormat();
  73.         } catch (NullPointerException npe) {
  74.             LogManager.logException(npe);
  75.         } catch (TextureFormatException tfe) {
  76.             LogManager.logException(tfe);
  77.         }
  78.        
  79.         // load the binary texture data and close the stream
  80.         textureData = loadTextureData(texture.width * texture.height * texture.bpp,true);
  81.        
  82.         // swap the r and g values
  83.         /*for (int i=0; i<textureData.length; i+=texture.bpp) {
  84.             textureData[i] ^= textureData[i+2] ^= textureData[i];
  85.             textureData[i+2] ^= textureData[i];
  86.         }*/
  87.         // the image is mirrored vertical, but why?
  88.         // one line
  89.         //byte[] line = new byte[texture.width * texture.bpp];
  90.         //for (int i=0; i<line.length)
  91.        
  92.         return createTexture(textureData);
  93.     }
  94.    
  95.     public int loadCompressedTexture(String textureName) throws TGAFormatException {
  96.         LogManager.log("Attempting to load a compressed TGA Image.");
  97.         texture = new Texture();
  98.         textureFile = new File(textureName);
  99.        
  100.         try {            
  101.             // get the real header ^^
  102.             tgaHeader = getHeader(tgaHeader.length);
  103.             // get the texture format
  104.             getTextureFormat();
  105.         } catch (NullPointerException npe) {
  106.             LogManager.logException(npe);
  107.         } catch (TextureFormatException tfe) {
  108.             LogManager.logException(tfe);
  109.         }
  110.        
  111.         textureData = new byte[texture.width * texture.height * texture.bpp];
  112.        
  113.         final int pixelCount = texture.width * texture.height;  // pixels in this image
  114.         int currPixel = 0;  // current pixel
  115.         int currByte = 0;   // current byte                
  116.         int chunkheader;
  117.        
  118.         do {
  119.             byte chunkHeader = 0;   // have to be unsigned -.-
  120.             // read
  121.             chunkheader = loadTextureData(1)[0] & 0xFF;
  122.            
  123.             // RAW Chunk
  124.             if (chunkheader < 128) {
  125.                 chunkheader++;      // number of raw pixels
  126.                
  127.                 // pixel reading
  128.                 for (int counter = 0; counter < chunkheader; counter++) {
  129.            
  130.                     writeTextureData(loadTextureData(texture.bpp),currByte);                   
  131.                    
  132.                     // increase the currByte counter
  133.                     currByte+=texture.bpp;                 
  134.                     currPixel++;
  135.                 }
  136.             } else {    // RLE Header
  137.                 chunkheader -= 127;
  138.                 // read the data
  139.                 colorBuffer = loadTextureData(texture.bpp);
  140.                
  141.                 // pixel loop
  142.                 for (int counter = 0; counter < chunkheader; counter++) {
  143.                    
  144.                     writeTextureData(colorBuffer,currByte);
  145.                    
  146.                     // increase the currByte counter
  147.                     currByte+=texture.bpp;
  148.                     currPixel++;
  149.                 }
  150.             }
  151.         } while (currPixel < pixelCount);
  152.        
  153.         return createTexture(textureData);
  154.     }
  155.    
  156.     private int createTexture(byte[] data) {
  157.         // put the data in a bytebuffer
  158.         final ByteBuffer textureBuffer = BufferUtils.createByteBuffer(data);
  159.         // create the glname for the new texture
  160.         final IntBuffer glName = generateGLName();
  161.        
  162.         generateTexture(glName);
  163.         bindTexture(glName.get(0));
  164.        
  165.         setLinearFilter();
  166.         generateTextureImage(textureBuffer);
  167.         texture.setGLName(glName.get(0));
  168.        
  169.         return glName.get(0);
  170.     }
  171.    
  172.     private void writeTextureData(byte[] colorBuffer,int currentByte) {
  173.         textureData[currentByte] = colorBuffer[2];      // R Byte
  174.         textureData[currentByte+1] = colorBuffer[1];    // G Byte
  175.         textureData[currentByte+2] = colorBuffer[0];    // B Byte
  176.        
  177.         // 32bit (alpha) check
  178.         if (texture.bpp == 4)
  179.             textureData[currentByte+3] = colorBuffer[3];    // A Byte
  180.     }
  181.    
  182.     public int getWidth(byte[] header) throws TextureFormatException {
  183.         return Math.abs(header[1] * 256 + header[0]);
  184.     }
  185.    
  186.     public int getHeight(byte[] header) throws TextureFormatException {        
  187.         return Math.abs(header[3] * 256 + header[2]);        
  188.     }
  189.    
  190.     public int getBitdepth(byte[] header) throws TextureFormatException {
  191.         // we have to prove the correct bitdepth ourself, because the texture only checks
  192.         // for zero values on width and height        
  193.         if (header[4] != 24 && header[4] != 32)
  194.             throw new TGAFormatException("bitdepth of the tga texture is not 24 or 32");
  195.         return header[4];
  196.     }
  197.    
  198.     public void getTextureFormat() throws TextureFormatException {        
  199.         texture.setWidth(getWidth(tgaHeader));
  200.         texture.setHeight(getHeight(tgaHeader));
  201.         texture.setBitdepth(getBitdepth(tgaHeader));        
  202.     }
  203. }
  204.  

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 22, 2007 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: So Feb 06, 2005 17:29
Beiträge: 187
Programmiersprache: C, C++
Vielen Dank fuer die Infos. Ich mach das jetzt erstmal mit Funktionen von Sum (stellt einfache Zeichnungsmethoden und guikomponenten zur verfuegung, um oop im unterricht zu lernen). Das ist zwar saulangsam (verwendet, wenn ich das jetzt richtig mitbekommen habe auch swing und ueberschreibt die paintmethode), reicht aber fuer den Anfang. So kann ich das Projekt, falls es fertig wird auch meinem Lehrer zeigen, ohne zu viel code erklaeren zu muessen.
Das mit dem direkt in eine Bilddatei speichern ist eine verdammt gute Idee. Warum ist mir das nicht eingefallen??? :lol:

Ich werds auf jeden Fall versuchen einzubauen, wenn alles andere soweit funktioniert.

_________________
Flummi: Projektseite und Projektthread


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]