Newsgroup: it.comp.java
Titolo: Image-->String

Salve, qualcuno sà dirmi come faccio a trasformare un'immagine in una
stringa di dati?
grazie
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 stringa di dati?
per curiosità, cosa devi farci?
Raffaele
-- 
Raffaele Castagno
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Il 27 Mag 2004, 14:29, 
aragorn...@yahoo.SEAL.it
 (Raffaele Castagno) ha
scritto:

Devo inviare un'immagine bitmap tramite protocollo SOAP ad un client
sviluppato in visual c++ che non supporta MIME. E tutto quello che riceve
trasforma da byte a char.
grazie.


 ha scritto nel messaggio
news:151Z100Z59Z2Y1...@usenet.libero.it...


 
Ma chi ha scritto questo client in vc++ immagino che ti abbia anche lasciato
un qualche genere di documentazione sul formato che si aspetta per
l'elaborazione delle immagini (spero), o forse il client dall'altra parte č
usato solo per "memorizzare" temporaneamente la stringa in attesa di un suo
recupero? immagino sia qualcosa del tipo message queue (MQSeries ti dice
niente?)
Comunque, se il client si aspetta solo una sequenza ASCII puoi gestirti
inizialmente tutta la parte MIME in casa trasformando il messaggio con
UUEncode. Per aiutarti puoi guardare la classe MimeBodyPart in JavaMail
(javax.mail.internet.MimeBodyPart). Prova cosě (ricordati di mettere anche
la libreria Java Activation Framework):
  import javax,mail.internet.MimeBodyPart;
  import javax.activation.FileDataSource;
  import javax.activation.DataHandler;
  import javax.activation.MimeTypesFileTypeMap;
  import java.io.ByteArrayOutputStream;
  ....
  MimetypesFileTypeMap typemap=new MimetypesFileTypeMap();
  typemap.addMimeTypes("image/bmp bmp BMP");
  typemap.addMimeTypes("image/jpeg jpg JPG jpeg JPEG");
  typemap.addMimeTypes("image/gif gif GIF");
  typemap.addMimeTypes("image/png png PNG");
  FileDataSource imagesource=new FileDataSource("<percorso dell'immagine">)
  imagesource.setFileTypeMap(typemap);
  MimeBodyPart bp=new MimeBodyPart();
  bp.setDataHandler(new DataHandler(imagesource));
  ByteArrayOutputStream os=new ByteArrayOutputStream();
  bp.writeTo(os);
  os.flush();os.close();
  String encodedImage=new String(os.toByteArray());
...e alla fine in encodedImage avrai una stringa che comprende tutta
l'immagine codificata esclusivamente usando caratteri ASCII (inclusi alcuni
header necessari per la successiva decodifica).
La decodifica č ancora piů semplice. Supponendo che tu abbia ricevuto la
stringa in [incomingImage]...
  import javax,mail.internet.MimeBodyPart;
  import java.io.ByteArrayInputStream;
  import java.io.InputStream;
  ...
  ByteArrayInputStream is =
     new ByteArrayInputStream(incomingImage.getBytes());
  MimeBodyPart bp=new MimeBodyPart(is);
  InputStream result=bp.getInputStream();
In result hai un InputStream che contiene l'immagine originale, e puoi farci
quello che vuoi. Un paio di idee:
1) riversare tutti su un file
2) darlo in pasto a javax.imageio.ImageIO per ottenere un
java.awt.image.BufferedImage su cui lavorare successivamente...
HTH ^_^
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
(per rispondere personalmente leva IlDitoDalCulo)


ha scritto:


 
Ma chi ha scritto questo client in vc++ immagino che ti abbia anche lasciato


Grazie molto.. sto per provare quello che mi hai scritto...però prima volevo
spiegarti più nel dettaglio il problema...
Il client è sviluppato in visual c++ embedded per smartphone e non supporta
le MFC... riceve tramite protocollo SOAP un'immagine (ma la lettura dalla
socket la fa sempre allo stesso modo qualunque cosa riceva, anche
l'intestazione di HTTP).
Ciò che riceve lo trasforma da byte a char... poi sono state implementate
delle funzioni che estrapolano i dati dell'immagine dal documento xml, li
trasforma in un'immagine (credo bitmap a 256 colori dato che è l'unica cosa
che acceta la DIALOGBOX) e la salva sul telefono.
Io devo sviluppare un web service con jboss implementando i metodi con java.
Ciò che non riesco a fare è spedire un'immagine al telefono.
Per il momento il server è molto semplice:
import java.awt.*;
import java.awt.event.*;
import osbaldeston.image.BMP;
public class test
{
    public test() {
    }
    public Image prendiImage(Integer name)throws Exception{
 
        	BMP bmp = new BMP(new java.io.File("C:\\pro.bmp"));
        Image image = bmp.getImage();
       return image;
    }
ma il client quando riceve il soap vede che c'è qualcosa di grande
(Byte=30000) ma quando li trasforma in char diventano pochissimi. Facendo la
stampa a video da solo 4-5 caratteri contro un'infinità di quelli mandati.
spero di non essermi dilungato molto.
grazie


 grazie
[QUOTO]
Che ne so' scusa? Tu che hai come oggetto che rappresenta l'immagine? Non ha
un metodo tipo toByteArray() o qualcosa di simile"?
Perchè non posti un pezzo di codice dove ti stai dannando per "trasformare
un immagine in una stringa?


 stringa di dati?
La classe allegata ha un costruttore pubblico
   public BMPImage(Image parImage, int parWidth, int parHeight);
e due metodi pubblici:
   public byte[] getBitmap();
   public void writeBitmap(OutputStream out) throws IOException;
Fanne buon uso.
- Dario
import java.awt.*;
import java.io.*;
import java.awt.image.*;
public class BMPImage {
   private final static int BITMAPFILEHEADER_SIZE = 14;
   private final static int BITMAPINFOHEADER_SIZE = 40;
   private byte bitmapFileHeader [] = new byte [14];
   private byte bfType [] = {'B', 'M'};
   private int bfSize = 0;
   private int bfReserved1 = 0;
   private int bfReserved2 = 0;
   private int bfOffBits = BITMAPFILEHEADER_SIZE+BITMAPINFOHEADER_SIZE;
   private byte bitmapInfoHeader [] = new byte [40];
   private int biSize = BITMAPINFOHEADER_SIZE;
   private int biWidth = 0;
   private int biHeight = 0;
   private int biPlanes = 1;
   private int biBitCount = 24;
   private int biCompression = 0;
   private int biSizeImage = 0x030000;
   private int biXPelsPerMeter = 0x0;
   private int biYPelsPerMeter = 0x0;
   private int biClrUsed = 0;
   private int biClrImportant = 0;
   private int bitmap [];
   private ByteArrayOutputStream fo;
   //--- Public constructor
   public BMPImage(Image parImage, int parWidth, int parHeight) {
     try {
       fo = new ByteArrayOutputStream();
       save(parImage, parWidth, parHeight);
     }
     catch(Exception ex) {
       ex.printStackTrace();
     }
   }
   //--- Public get method
   public byte[] getBitmap() {
     return fo.toByteArray();
   }
   //--- Public write method
   public void writeBitmap(OutputStream out) throws IOException {
     fo.writeTo(out);
   }
   private void save(Image parImage, int parWidth, int parHeight)
     throws Exception {
     convertImg(parImage, parWidth, parHeight);
     writeBitmapFileHeader();
     writeBitmapInfoHeader();
     writeBitmap();
   }
   private void convertImg(Image parImage, int parWidth, int parHeight)
     throws Exception {
     int pad;
     bitmap = new int [parWidth * parHeight];
     PixelGrabber pg = new PixelGrabber(parImage, 0, 0,
                                        parWidth, parHeight,
                                        bitmap, 0, parWidth);
     pg.grabPixels();
     pad = (4 - ((parWidth * 3) % 4)) * parHeight;
     biSizeImage = ((parWidth * parHeight) * 3) + pad;
     bfSize = biSizeImage
       + BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;
     biWidth = parWidth;
     biHeight = parHeight;
   }
   private void writeBitmap() throws Exception {
     int size;
     int value;
     int j;
     int i;
     int rowCount;
     int rowIndex;
     int lastRowIndex;
     int pad;
     int padCount;
     byte rgb [] = new byte [3];
     size = (biWidth * biHeight) - 1;
     pad = 4 - ((biWidth * 3) % 4);
     if(pad == 4)
       pad = 0;
     rowCount = 1;
     padCount = 0;
     rowIndex = size - biWidth;
     lastRowIndex = rowIndex;
     for(j = 0; j < size; j++) {
       value = bitmap [rowIndex];
       rgb [0] = (byte) (value & 0xFF);
       rgb [1] = (byte) ((value >> 8) & 0xFF);
       rgb [2] = (byte) ((value >>  16) & 0xFF);
       fo.write(rgb);
       if(rowCount == biWidth) {
         padCount += pad;
         for(i = 1; i <= pad; i++)
           fo.write(0x00);
         rowCount = 1;
         rowIndex = lastRowIndex - biWidth;
         lastRowIndex = rowIndex;
       }
       else
         rowCount++;
       rowIndex++;
     }
     //--- Update the size of the file
     bfSize += padCount - pad;
     biSizeImage += padCount - pad;
   }
   private void writeBitmapFileHeader() throws Exception {
     fo.write(bfType);
     fo.write(intToDWord(bfSize));
     fo.write(intToWord(bfReserved1));
     fo.write(intToWord(bfReserved2));
     fo.write(intToDWord(bfOffBits));
   }
   private void writeBitmapInfoHeader() throws Exception {
     fo.write(intToDWord(biSize));
     fo.write(intToDWord(biWidth));
     fo.write(intToDWord(biHeight));
     fo.write(intToWord(biPlanes));
     fo.write(intToWord(biBitCount));
     fo.write(intToDWord(biCompression));
     fo.write(intToDWord(biSizeImage));
     fo.write(intToDWord(biXPelsPerMeter));
     fo.write(intToDWord(biYPelsPerMeter));
     fo.write(intToDWord(biClrUsed));
     fo.write(intToDWord(biClrImportant));
   }
   private byte [] intToWord(int parValue) {
     byte retValue [] = new byte [2];
     retValue [0] = (byte) (parValue & 0x00FF);
     retValue [1] = (byte) ((parValue >>  8) & 0x00FF);
     return retValue;
   }
   private byte [] intToDWord(int parValue) {
     byte retValue [] = new byte [4];
     retValue [0] = (byte) (parValue & 0x00FF);
     retValue [1] = (byte) ((parValue >>  8) & 0x000000FF);
     retValue [2] = (byte) ((parValue >>  16) & 0x000000FF);
     retValue [3] = (byte) ((parValue >>  24) & 0x000000FF);
     return retValue;
   }
}

 La classe allegata ha un costruttore pubblico
[CUT]
ehehehe... quando si dice Open Source :P


Sto usando java... l'oggetto e Image.
// web service con jboss
import java.awt.*;
import java.awt.event.*;
import osbaldeston.image.BMP;
public class test
{
    public test() {
    }
    public Image prendiImage(Integer name)throws Exception{
 
       	BMP bmp = new BMP(new java.io.File("C:\\pro.bmp"));
        Image image = bmp.getImage();
       return image;
    }
Devo trasformarla in una stringa di byte per trasferirla con soap ad un
client in visual c++, il quale qualunque cosa legge la trasforma da byte a
char.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


grazie.
Poi domani la provo.


    public void writeBitmap(OutputStream out) throws IOException;
Tempo fa feci anch'io qualcosa di simile per elaborare delle bitmap, con la
differenza che io leggevo e scrivevo da file.
Anche se qui la portabilita' di java si restringe di molto
-- 
<artemis:alpeia xmlns:artemis="
http://utenti.lycos.it/artemis
" />

Grazie tantissimo, funziona correttamente, o quasi... quando vado a fare la
decodifica con visual c++ mette uno \n all'inizio della stringa di byte che
compromette la visualizzazione... ma č stato molto semplice risolvere il
problema.
Ora ho un'altro, forse banale, problema... prima di spedire l'immagine la
devo tagliare (non adattare)... sai dirmi come?
grazie mille.
ciao
