Zum Inhalt springen

Java Cracks aufgepasst!


Empfohlene Beiträge

Ahoi!

Hab da eine Frage was Java betrifft. Vielleicht kann ja jemand von euch helfen, wär schon klass :rolleyes: :)

 

Meine Frage hab ich eigtl. schon hier gepostet - aber da geht nix weiter *gg* http://www.java-forum.org/de/viewtopic.php?t=4523

 

Hier die kopie des Beitrages

Hallo!

Ich lade aus einer DB einen Pfad zu einem Bild. Diesen möchte ich an ein Servlet übergeben welches mir das Bild dann in einem neuen Fenster öffnet (gefilter mit einer Filter-Klasse)

Aber langsam:

 

Die Klasse die meine Bilder filtert:

 

Code:

 

package photoalbum_neu;

import java.awt.image.*;

public class GreyFilter extends RGBImageFilter {

public GreyFilter() {

canFilterIndexColorModel = true;

}

 

public int filterRGB(int x, int y, int rgb) {

int a = rgb & 0xffff0000;

int r = (((rgb & 0x000000) + 0x000000)/25) & 0xff0000;

int g = (((rgb & 0x005500) + 0x0ff000)/2) & 0x00ff00;

int b = (((rgb & 0x0000f7) + 0x000ff0)/2) & 0x0000ff;

return a | r | g | b;

}

}

 

 

Okay, dann habe ich als Test ein Frame gemacht welches mir einmal das Bild normal und einmalgefilter anzeigt:

Code:

 

(...)

Image bunt, grau;

private void jbInit() throws Exception {

 

//hier sid alle möglichen grafischen Sachen gelöscht worden....

 

bunt = getToolkit().getImage("test.jpg");

ImageFilter filter = new GrayFilter();

ImageProducer erzeuger = new FilteredImageSource(bunt.getSource(), filter);

grau = this.createImage(erzeuger);

jLabel1.setIcon(new ImageIcon(bunt));

jLabel2.setIcon(new ImageIcon(grau));

}

(...)

 

 

Da funktioniert bestens. Die Image Objekte bunt und grau werden in den Labels angzeigt.

Nun möchte ich das ganze aber in einer jsp anzeigen lassen (ohne applet!). Ich dachte mir folgendes:

ein Link zu folgendem Servlet Das Servlet wird aufgerufen und...

 

 

Servlet:

Code:

 

package photoalbum_neu;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import java.awt.image.*;

import java.awt.Image;

import java.awt.*;

 

public class imageFilter extends HttpServlet {

private static final String CONTENT_TYPE = "text/html";

 

 

//Initialize global variables

public void init() throws ServletException {

 

}

 

//Process the HTTP Get request

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 

response.setContentType("image/jpeg");

ServletOutputStream output = response.getOutputStream();

String b = request.getParameter("action"); //der übergebene Pfad

if (b != null)

{ // logged in and action specified

 

//targetURL = "/logout.jsp";

Image bunt = null;

Image grau = null;

 

bunt = Toolkit.getDefaultToolkit().getImage(b); //Image

ImageFilter filter = new GreyFilter();

ImageProducer erzeuger = new FilteredImageSource(bunt.getSource(), filter);

 

JpegEncoder encoder = new JpegEncoder(bunt, output);

response.setContentType("image/jpeg");

encoder.encode();

output.print(" + b + "); //HIER WIRD'S WICHTIG!!!!!!!! [1]

 

}

/* response.getOutputStream(output);

RequestDispatcher rd = request.getRequestDispatcher(targetURL);

rd.forward(request, response);

*/

}

 

//Process the HTTP Post request

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

 

//Clean up resources

public void destroy() {

}

}

 

 

 

[1] Hier wollte ich als Test einfach mal das Bild welches ich miteels action=.... übergeben habe ausgeben. geht nicht :o/

Okay: Was mache ich zu diesem Punkt falsch?

 

2.) Wie verwende ich die Klassen ImageEncoder und JPEGEncoder richtig? (http://www.acme.com/java/software/Acme.JPM.Encoders.ImageEncoder.html

http://www.acme.com/java/software/Acme.JPM.Encoders.JpegEncoder.html) Sie sollte mir doch ein JPEG zurückliefern welches ich dann im Browser anzeigen kann. :/

 

Mein Ziel wäre es, ein Bild normal und gefilter nebeneinander in einer jsp anzeigen zu können.

Bin heute schon stundenlang dabei gesessen...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

also wenn man dem link zum jpeg encoder folgt, steht da unter anderem:

 

public class JpegEncoder

extends ImageEncoder

 

Write out an image as a JPEG. DOESN'T WORK YET.

 

sieht also so aus als würde das kein brauchbares jgep zurückliefern.

 

zum anderen... stimmt die url? hast schon versuch die url als text rauszuschreiben bzw den fertigen image-tag als text zu schreiben zwecks kontrolle ob der stimmt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke NoFloh! Werd den Encoder von Sun verwenden :s:

 

Wegen dem Bild zurückliefern:

Ich hab ja, wie beschrieben das Bild in einem neuen Fenster mit output.print(" + b + "); ausgeben lassen -> Aber: in b, wo eigtl. nur "http://www.blabla.at/bild.jpg" drinne stehen dürfte, steht nun komplett alles drinnen, nämlich "imageFilter?action=http://www.blabla.at/bild.jpg" Was mir irgenwie nich ganz koscher ist! Dass kann doch nicht sein, daß request.getParameter("action"); wieder action=.... liefert. Das endet dann doch in Endlosschleifen bei jedem Link!!! Ich bin komplett verwirrt was da los ist. Am besten ich fang amal neu mit der dem anderen imageEncoder an, vielleicht hab ich einfach irgendwo (auch wenns nu im servlet is, was mitm encoden nix zutun hat) einen scheiß eingebaut... :rolleyes: :f:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von GrazerTourer

Danke NoFloh! Werd den Encoder von Sun verwenden :s:

 

Wegen dem Bild zurückliefern:

Ich hab ja, wie beschrieben das Bild in einem neuen Fenster mit output.print(" + b + "); ausgeben lassen -> Aber: in b, wo eigtl. nur "http://www.blabla.at/bild.jpg" drinne stehen dürfte, steht nun komplett alles drinnen, nämlich "imageFilter?action=http://www.blabla.at/bild.jpg" Was mir irgenwie nich ganz koscher ist! Dass kann doch nicht sein, daß request.getParameter("action"); wieder action=.... liefert. Das endet dann doch in Endlosschleifen bei jedem Link!!! Ich bin komplett verwirrt was da los ist. Am besten ich fang amal neu mit der dem anderen imageEncoder an, vielleicht hab ich einfach irgendwo (auch wenns nu im servlet is, was mitm encoden nix zutun hat) einen scheiß eingebaut... :rolleyes: :f:

 

das klingt schwer danach als hättest irgendwo an fehler drin.

 

viel erfolg auf jeden fall ;o) du kannst ja das bild auch direkt in bytes auslesen dann sparst dir den encoder.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von NoFloh

viel erfolg auf jeden fall ;o) du kannst ja das bild auch direkt in bytes auslesen dann sparst dir den encoder.

 

Danke, der Erfolg wird schon kommen ;) hoffentlich.... :s:

Meine GreyFilter Klasse liefert mir ein image Objekt zurück. Ich wüsste nicht wie ich in einem Browser dieses Objekt anzeigen kann, ohne dabei einen JPEG oder GIFEncoder zu verwenden?! Kann ich da Image Objekt einfach in einen ByteStream (gibst sowas?) umwandeln und dem, Broswer in einem ..... Tag übergeben? Das wär ja super zum Quadrat!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von GrazerTourer

Danke, der Erfolg wird schon kommen ;) hoffentlich.... :s:

Meine GreyFilter Klasse liefert mir ein image Objekt zurück. Ich wüsste nicht wie ich in einem Browser dieses Objekt anzeigen kann, ohne dabei einen JPEG oder GIFEncoder zu verwenden?! Kann ich da Image Objekt einfach in einen ByteStream (gibst sowas?) umwandeln und dem, Broswer in einem ..... Tag übergeben? Das wär ja super zum Quadrat!

 

wenn du dem einen link folgst den ich dir geschickt hab findest du die anleitung dafür...

 

 

....

// Build a full file specification

String imageSpec = imageDir + imageFile;

 

// Get the image file and write it out the response object

byte[] image = KeyReader.getBytesFromFile(new File(imageSpec));

response.setContentType("image/JPEG");

response.getOutputStream().write(image);

}

 

public static byte[] getBytesFromFile(File file) throws IOException {

 

InputStream is = new FileInputStream(file);

 

....

 

dort findet sich auch noch eine erweiterung

 

"Currently you read the entire file into memory which could use a lot of memory, instead you could a buffer and write directly to output stream as u read."

 

public staticvoid getBytesFromFile(File file, OutputStream out) throws IOException {

 

InputStream is = new FileInputStream(file);

 

// Create the byte array to hold the data

byte[] bytes = new byte[1024];

 

// Read in the bytes

int offset = 0;

int numRead = 0;

while ((numRead = is.read(bytes)) >= 0) {

out.write(buf, 0, numRead);

}

 

// Close the input stream and return bytes

is.close();

}

 

details bitte dort nachlesen.

 

ich meine das sollte funktionieren

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von GrazerTourer

Das schaut ja echt ganz okay aus :) Werd ich übers Wochenende probieren!!

 

Danke! :cool:

 

bitte gerne. wozu ham mich meine eltern studieren lassen, oder so :p ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

×
×
  • Neu erstellen...