View Full Version : [Java] Accesso a files da piu'thread
zakmckraken
16-02-2010, 21:34
Ciao a tutti!
Mi domandavo se qualcuno aveva un idea su questo mio problema:
ho una servlet che dati un percorso e delle coordinate legge una immagine ne fa il crop e salva questa immagine con un nuovo nome tipo "percorso_x_y_w_h"
Ora, sotto .NET con i files ashx (tipo servlet per intenderci) non ci son problemi di sorta. Mentre se faccio lo stesso in Java mi trovo in una situazione inquietante:
1) Leggo a.jpg, ne taglio un pezzo che chiamo b.jpg
2) Quasi contemporaneamente leggo a.jpg e ne taglio un pezzo DIVERSO che ciamo c.jpg...
3) Il risultato e'che b.jpg e c.jpg sono uguali!!!!!!!!!!!
Notare che a.jpg e'sul classpath e viene letta tramite getClassLoader().getResourceAsStream mentre b.jpg e c.jpg sono sul filesystem reale..
Per scrivere i vari files da file system uso ImageIO.write ..non e'che il metodo non e'thread safe???
Se qualcuno ha un idea si faccia avanti che sto impazzendo!! Grazie a tutti!! :)
Non vedo problemi di thread. Probabilmente c'è un errore logico nel programma.
zakmckraken
16-02-2010, 22:59
Beh, ti direi di si se non funzionasse con .Net, il codice e'praticamente lo stesso (a parte le librerie di sistema e la sintassi per intenderci), con caricamento delle risorse dalle dll e salvataggio in area temporanea, o meglio cache.. mi sarei piu'aspettato che funzionasse Java! C'e'da dire anche che sono sotto Linux con una Jvm openSource, ma mi sembra strano possa centrare.
Tra l'altro se preparo le immagini corrette nella mia cache poi vengono viste correttamente.
Poi non faccio certo cose turche, ho questa servlet che serve per caricare le immagini che legge con getResourceAsStream dal classloader una jpg (per es) dal jar, se trova una jpg nella cache con lo stesso nome legge quella e la invia al client altrimenti crea in cache la nuova immagine, la legge e la invia al client...
Sto andando di debugger ma non vedo nulla di strano!!
Adesso arrivero'a segnarmi gli id delle istanze di classe per vedere se per caso ci sono duplicati che appaiono come per magia...
Java su Linux funziona allo stesso modo di Java su Windows.
Il problema è che se hai un'immagine, ne leggi due parti diverse e quelle due parti ti risultano uguali o le letture non sono diverse o vai a sovrascrivere uno dei due risultati con l'altro.
zakmckraken
16-02-2010, 23:33
Speravo in qualcosa del genere, in preda al delirio cosmico ho provato a caricare i files tramite la servlet uno per uno, la notizia sconvolgente e che sembra che non vengano considerate le coordinate con cui taglio l'immagine... se non altro non mi sono rimbecillito del tutto, ma a sto punto mi domando se il metodo che uso ha un senso...
//NB res e'un'array di bytes contenente l'immagine sorgente
BufferedImage imgRes = null;
img = ImageIO.read(new ByteArrayInputStream(res));
imgRes = img.getSubimage(x, y, w, h);
ImageIO.write(imgRes, type, new File(totalPath));
zakmckraken
16-02-2010, 23:53
Qualcuno dice sia un bug...
https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/241346 e in effetti il mio caso
When the source is a GIF file, getSubimage respects the width and height parameters, but uses the top left coordinate of the source image to create the destination, regardless of parameter values.
Nella bugparade lo danno per risolto con la versione _7 (quella attuale è la _18)
Prova a creare un buffer temporaneo:
imgRes = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
imgRes.getGraphics().drawImage(img, -x, -y, null);
zakmckraken
17-02-2010, 08:31
Ed in effetti colla copia del buffer funziona magicamente tutto e si "dimentica" di essere una gif... Per la cronaca, se accade ad altri, il "java -version" mi dava questo:
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.6.2) (suse-5.10.1-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
E grazie per aiuto & collaborazione! Ieri sera poi sono crollato col pc acceso :(
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.