Http i image

0

Problem:
Wysyłam GET'a pod podany adres WWW i w odpowiedzi dostaję ciąg danych będący rysunkiem.
[code]
url.openConnection();
InputStreamReader in = new InputStreamReader(url.openStream());
BufferedReader br = new BufferedReader (in);
String line = null;
FileOutputStream FOS = new FileOutputStream("d:\aaa.jpg");
while((line = br.readLine()) != null){
System.out.println(line);
FOS.write(line.getBytes());
jp.repaint();
}
[/code]
Wyświetlam sobie to co przychodzi i widzę, że format jest podobny do jpg z jakimś nagłówkiem http jak mniemam.
Początek wygląda tak:
--foo
Content-Type: image/jpeg
Content-Length: 32189

˙Ř˙ŕ ...

Teraz pytanie jak to sparsować żeby otrzymać plik jpeg?
Próbowałem zapisać to co mi tam wychodzi, ale niestety windows pluje informacją, że plik jest niepoprawny. Porównując go z innym plikiem jpg wygląda na to, że spacje i entery są niepoprawne... teraz pytanie czy może java potrafi to zrobić jakoś automatycznie czy muszę sam bawić się w parsowanie tego jpeg'a?
Bardzo dziękuję za pomoc.
Pozdrawiam

0

Próbowałeś url.getContent()?

0

Co u Ciebie znaczy sparsować? Jest takie coś jak MIME. szukasz odpowiednika do rozszerzenia. Tu masz sprawę prostą bo jak sama nazwa wskazuje ciągniesz jpega

0

Chodzi mi o to, że w odpowiedzi strony dostaję ciąg będący plikiem jpeg i chcę z niego zrobić normalny rysunek.

0

while((line = br.readLine()) != null)

Czytanie pliku binarnego liniami jest raczej ekstrawaganckim pomysłem. Metoda readLine() odczytuje wszystko bez znaku końca linii, zatem gubisz część zawartości czytanego pliku.

0

A jak można to zrobić inaczej?
może przy użyciu JPEGCodec? tylko że tutaj pluje błędem z uwagi na to że każdy ciąg ma swój przedrostek składający się z 3 linii.

0
conn=url.openConnection();
conn.connect();
DataInputStream dis=new DataInputStream(new BufferedInputStream(conn.getInputStream()));
FileOutputStream fos = new FileOutputStream(nazwaPliku);
int rozmiar=conn.getContentLength();
byte[] bajty=new byte[rozmiar];
int przeczytane=0;
while(przeczytane<rozmiar)
{
     przeczytane+=dis.read(bajty,przeczytane,rozmiar-przeczytane);
}
fos.write(bajty,0,przeczytane);
dis.close();
fos.close(); 
0

drążąc temat doszedłem do czegoś takiego:
[code]
BufferedInputStream bis = new BufferedInputStream(url.openStream());
DataInputStream dis= new DataInputStream(bis);
while(true){
dis.readLine();dis.readLine();dis.readLine();dis.readLine();
//jp.setBI(JPEGCodec.createJPEGDecoder(dis).decodeAsBufferedImage());
jp.setBI(ImageIO.read(dis));
dis.readLine();
jp.repaint();

		}

[/code]
Dla JPEGCodec to działa świetnie i nie ma problemu, ale niestety dla ImageIO nie... wygląda to tak jakby ImageIO czytał do złego miejsca. Jako 'dis' mam ciąg jpgów rozdzielonych: <CRLF><CRLF><CRLF><CRLF>JPG<CRLF><CRLF><CRLF><CRLF><CRLF>JPG<CRLF> itd. i wygląda na to, że ImageIO coś robi z końcem JPG'a i czytanie crlf'a po JPGu nie trafia w niego tylko w jakąś część pliku - należy podkreślić, że pierwszy JPG jest poprawnie wyświetlany przez ImageIO dopiero kolejne psują sprawę.
Co trzeba zrobić, żeby ImageIO działało poprawnie?1

0

Moje rozwiązanie działa dla wszystkich typów plików (nie tylko graficznych), działa też dobrze jeżeli ściągasz po kolei kilka plików.

0

U mnie niestety nie działa ze względu na negatywną wielkość zmiennej rozmiar. Tu jest taki problem, że ciąg który ja czytam jest zmienny - przesyła go kamera. Przynajmniej tak widzę ten problem.

0

Jaja sobie robisz. Nie mogłeś tego napisać w pierwszym poście?

0

Wybacz jeśli źle mnie wcześniej zrozumiałeś. Myślałem, że sprawa ogranicza się do czytania jpg ze strony z uwagi na ten sposób odczytu. Nie komplikuję sobie sprawy poprzez czytanie bezpośrednio z socetu czy też przez mpg tylko zwyczajnie zaciągając ze strony html rysunek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1