Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > BufferedImage problem
Antwort
 
Themen-Optionen
Alt 25.08.2005, 13:04   Nach oben    #1
Benutzer
 
Registriert seit: 25.10.2004
Beiträge: 38
Standard BufferedImage problem

Hallo,
ich wundere mich gerade eben über die BufferedImage-Klasse!

Es ist so nämlich:
Ich habe ein BufferedImage-Array der länge 16. In jedem Arrayfeld ist nun eine Instanz der BufferedImage Klasse (je ein bild ). Mein Anliegen ist es nun die Bilddaten unverändert zu erhalten (also von jedem Bild alle Pixelwerte).

Da mir der Pixelgrabber "verfälschte" Bilddaten zurückgibt, gehe folgendermassen vor: ich hole mir von jedem BufferedImage ein WritableRaster, von diesem dann ein DataBuffer (in meinem Fall speziell DataBufferByte). Ven dem DataBufferByte erhalte ich per getData() ein byte-Array, wo die Pixeldaten drin sind. So weit so gut.

Nun verhält sich das ganze recht komisch! Egal von welchem BufferedImage aus dem Array-Feld ich das DataBufferByte erhalte, ist das daraus resultierende byte-Array IMMER gleich (alle Pixelwerte stimmen jeweils überein) und enthält ALLE Bildedaten von allen BufferedImages hintereinandergehängt. Nun kann ich zwar (nachdem ich dieses Verhalten rausgefunden habe) die Pixeldaten für jedes Bild gezielt aus dem byte-Array rauskopieren, aber denke dass das nicht so gewollt ist (zumindest war meine Annahme, dass in jedem BufferedImage nur die Bilddaten drin sind, die zu diesem auch gehören, und nicht, dass alle Bilddaten in alle BufferedImges drin sind)! Ist es evtl. sogar ein BUG???

wenn es ein BUG ist, wär es ja Blöd, wenn ich dass so jetzt implementiere, und bei nachsten update (oder Java5... benutze gerade Version 1.4.2), dieses Verhalten korrigiert wird, dann geht meine Routine ja nicht mehr!

Hat da jemand Erfahrungen damit, und weiß jemand den Grund, warum das so ist und ob es so sogar auch sein soll?

Gruß,
alekz
alekz ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.08.2005, 22:09   Nach oben    #2
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Hallo Alekz!

Ich arbeite des öfteren mit Buffered Images, auch in Arrays.
Probleme habe ich bisher noch keine gehabt.
Was genau hast du denn vor? Vielleicht läßt sich das Problem anderweitig umgehen?
Magst du ein wenig Code zeigen damit man dran rumprobieren kann?

Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.08.2005, 16:18   Nach oben    #3
Benutzer
 
Registriert seit: 25.10.2004
Beiträge: 38
Standard

Hallo sparrow,

der code:

PHP-Code:
package de.kgc.bufferedImgTester;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.IOException;

import com.pixelmed.dicom.AttributeList;
import com.pixelmed.dicom.DicomException;
import com.pixelmed.display.SourceImage;


/**
 * @author alekz
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class BufferedImgTester {

    private 
BufferedImage[] imgs;

    
/**
     * 
     */
    
public BufferedImgTester() {
        
        
testePixelMed();
    }

    
    public 
void testePixelMed() {
        
        
AttributeList attributeList = new AttributeList();
        try {
            
attributeList.read("c:/MR-MONO2-8-16x-heart.dcm");
        } catch (
IOException e) {
            
e.printStackTrace();
        } catch (
DicomException e) {
            
e.printStackTrace();
        }
        
        
SourceImage source null;
        
BufferedImage[] bImgs null;
        try {
            
source = new SourceImage(attributeList);
        } catch (
Throwable t) {
            
System.out.println("error");
        }

        
bImgs source.getBufferedImages();
        
System.out.println("bImgs.length: "+bImgs.length);
        
        
WritableRaster wr bImgs[0].getRaster();
        
DataBufferByte dbb = (DataBufferByte)wr.getDataBuffer();
        
byte[] data dbb.getData();
        
        
System.out.println("data.length: "+data.length);
    }
    

    public static 
void main(String[] args) {
        new 
BufferedImgTester();
    }


zur Info:
.dcm Datei sind medizinische Dateien, die Metadaten und Bilddaten enthalten. Dabei können in einer .dcm-Datei
mehrere Bilder enthalten sein. Meist sind es Graustufenbilder. Im Anhang findest du die Datei
"MR-MONO2-8-16x-heart.dcm". Diese enthält 16 Graustufenbilder, die jeweil 256x256 Pixel messen, wobei
jedes Pixel 8Bit Farbtiefe hat. (dcm-Dateien kann man sich z.B. mit dem Sante Viewer anschauen (auch die
Metadaten http://users.forthnet.gr/ath/mkanell/viewer/viewer.html )

Die library pixelmed.jar (http://www.dclunie.com/pixelmed/soft...e/pixelmed.jar )
holt mir aus mit "bImgs = source.getBufferedImages();" aus einer .dcm-Datei die Pixeldaten heraus
und gibt diese mir in einem Array aus BufferedImages zurück. Wenn ich mir die BufferedImages anzeigen lasse,
dann sehe ich, dass dort jeweil unterschiedlich Bilder drin sind.

Wenn ich aber, wie oben zu sehen ist, die Pixeldaten in ein byte-Array hole, dann genügt es merkwürdigerweise
diese aus dem ersten (oder zweitem, oder drittem, ...) herauszuholen. In dem Bytearray sind dann ALLE Bilder
drin, die hintereinandergereit sind. Das sieht man zum Beispiel, wenn ich die länge des byte-Array zurückgeben
lasse. Das zeigt dann auch nämlich die zahl an, die sich errechnen lässt mit width*heigth*frames.

Der Code oben ist nur ein Aussschnitt. Zwischendurch habe ich mir zu testzwecken die BufferedImages anzeigen
lassen, und die Daten in dem Byte-Array nutze ich, um die Bilder im JPEG2000 Format zu speichern.

kannst du alles nachvollziehen? wenn nicht, dann frag einfach.

Lieben Gruß,
alekz
Angehängte Dateien
Dateityp: rar MR-MONO2-8-16x-heart.rar (316,4 KB, 0x aufgerufen)
alekz ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.08.2005, 17:43   Nach oben    #4
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Ich tippe auf einen Fehler in SourceImage.
Speziell in der Methode .getBufferedImages();

Magst du die Klasse kurz zeigen?
Vielleicht ein Fehler bei dem Füllen der einzelnen Array-Elemente?

Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.08.2005, 13:19   Nach oben    #5
Benutzer
 
Registriert seit: 25.10.2004
Beiträge: 38
Standard

Hallo,

die Klasse SourceImage liegt in der Bibliothek pixelmed.jar.

dabei sieht getBufferedImages folgendermassen aus:

PHP-Code:
    public BufferedImage[] getBufferedImages() { return imgs; } 
ist ja noch nicht so spannend


hier ein auszug der Funktion, der interressant für meine Bilder ist (hier wird imgs gefüllt (die ganze Fanktion befindet sich im Anhang)

PHP-Code:

        
else if (isGrayscale && samples == && depth <= 8){
//System.err.println("SourceImage.constructSourceImage(:( grayscale <= 8 bits");
            
byte data[] = null;
            
Attribute a = list.get(TagFromName.PixelData);
            if (
ValueRepresentation.isOtherByteVR(a.getVR())) {
                
byte[] sdata a.getByteValues();
                
data = new byte[nsamples];
                for (
int count=0count<nsamples; ++count) {
                    
int value=((int)sdata[count])&mask;
//System.err.print("value masked = "+Integer.toHexString(value));
                    
if (signed && (value signbit) != 0value=value extend;
//System.err.println(" extended = "+Integer.toHexString(value));
                    
if (hasPad && value == pad ) {
                        
value=0;
                    }
                    
data[count]=(byte)value;
                    
//if (value > imgMax) imgMax=value;
                    
if (value imgMax && value <= largestGrayimgMax=value;
                    if (
value imgMinimgMin=value;
                                        
//imgSum+=value;
                                        //imgSumOfSquares+=value*value;
                
}
            }
            else {
                
short sdata[] = a.getShortValues();
                
data = new byte[nsamples];
                
int slen=nsamples/2;
                
int scount=0;
                
int count=0;
                while (
scount<slen) {
                    
int value=((int)sdata[scount++])&0xffff;    // the endianness of the TS has already been accounted for
                    
int value1=value&mask;                // now just unpack from low part of word first
                    
if (signed && (value1 signbit) != 0value1=value1 extend;
                    if (
hasPad && value1 == pad ) {
                        
value1=0;
                    }
                    
data[count++]=(byte)value1;
                    
//if (value1 > imgMax) imgMax=value1;
                    
if (value1 imgMax && value1 <= largestGrayimgMax=value1;
                    if (
value1 imgMinimgMin=value1;
                                        
//imgSum+=value1;
                                        //imgSumOfSquares+=value1*value1;
                    
                    
int value2=(value>>8)&mask;
                    if (
signed && (value2 signbit) != 0value2=value2 extend;
                    if (
hasPad && value2 == pad ) {
                        
value2=0;
                    }
                    
data[count++]=(byte)value2;
                    
//if (value2 > imgMax) imgMax=value2;
                    
if (value2 imgMax && value2 <= largestGrayimgMax=value2;
                    if (
value2 imgMinimgMin=value2;
                                        
//imgSum+=value2;
                                        //imgSumOfSquares+=value2*value2;
                
}
            }
            
int offset=0;
            for (
int frame=0frame<nframes; ++frame) {
                
imgs[frame]=createByteGrayscaleImage(width,height,data,offset);
                
offset+=nframesamples;
            }
        } 
hier ist am interessantesten der Aufruf:
imgs[frame]=createByteGrayscaleImage(width,height,data,offset );

diese Funktion sieht folgendermassen aus:

PHP-Code:

    
private static BufferedImage createByteGrayscaleImage(int w,int h,byte data[],int offset) {
//System.err.println("createByteGrayscaleImage");
        
ComponentColorModel cm=new ComponentColorModel(
            
ColorSpace.getInstance(ColorSpace.CS_GRAY),
            new 
int[] {8},
            
false,        // has alpha
            
false,        // alpha premultipled
            
Transparency.OPAQUE,
            
DataBuffer.TYPE_BYTE
        
);

        
ComponentSampleModel sm = new ComponentSampleModel(
            
DataBuffer.TYPE_BYTE,
            
w,
            
h,
            
1,
            
w,
            new 
int[] {0}
        );

        
DataBuffer buf = new DataBufferByte(data,w,offset);
                
        
WritableRaster wr Raster.createWritableRaster(sm,buf,new Point(0,0));
                
                return new 
BufferedImage(cm,wr,true,null);    // no properties hash table
    

ich habe versucht aus einem kleinen Test-Programm diese Funktion aufzurufen, aber da kam der Fehler, dass das WritableRaster und das ComponentColorModel nicht miteinander "vereinabar" sind: IllegalArgumentException. evtl. liegt der fehler in dieser Funktion?

Vielen dank für deine Mühe,
alekz
Angehängte Dateien
Dateityp: txt nurEinerFunktion.txt (12,8 KB, 2x aufgerufen)
alekz ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2005, 14:39   Nach oben    #6
Benutzer
 
Registriert seit: 25.10.2004
Beiträge: 38
Standard

Hi,

wie ist denn das jetzt? Das problem ist immer noch aktuell.

Gruß,
alekz
alekz ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem E-Mails zu senden Jann Hendrik Plauderecke 7 25.05.2007 21:37
Logisches Problem beim einsatz von Ereignissen Prophet Allgemeine Java-Programmierung 19 05.06.2006 22:08
BufferedImage bemalen - Vorgehensweise? Sayang Desktop-Applikationen und Grafik 5 11.05.2006 15:14
Problem mit Cookie und Reloads... Bookworm PHP-Programmierung 10 13.04.2006 12:09
OSX + Eclipse 3.1 Problem bacarni Eclipse 3 29.07.2005 21:19


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:13 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44