2012-05-04 2 views
1

Я наткнулся на эту проблему сегодня, позвольте мне объяснить проблему:Jpg кодирование с Java

У меня есть это веб-приложение Java, который имеет дело с большим количеством файлов изображений. Это разрешает только файлы JPG (политика компании, я думаю ...). Файлы хранятся в определенном месте, а процесс загрузки и создания миниатюр выполняется довольно хорошо. Изображения отображаются с использованием класса Java, потому что компания не хочет показывать путь.

Дело в том, что некоторые из показанных изображений являются темными; не все черные, немного темнее исходного загруженного файла. Я проверил загруженные файлы и миниатюры, и они выглядят хорошо, они совсем не потемнели.

Это то, что вещь становится странной: я тестировал на локальном хосте, и картинки отображаются правильно, когда я тестирую на сервере, они выглядят темными. Единственное различие между ними заключается в том, что на localhost я работаю над Windows, а тестовым сервером является Linux. Оба используют JBOSS 4.2.0.

Это метод, который делает трюк:

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 
     throws Exception {    

    String ruta = rutaBase + File.separator; 
    String fileName=(String)request.getParameter("fileName"); 

    if (fileName==null) 
     fileName=""; 
    if (!fileName.equals("")) { 
     RemoteFileClient oRemoteFileClient = new RemoteFileClient(); 
     ServletOutputStream output = response.getOutputStream(); 
     if (oRemoteFileClient.isAlive()) { 
      String file2download=ruta+fileName; 
      byte[] contenido=oRemoteFileClient.downloadFile(file2download);     
      if (contenido!=null) { 
       String myContentType=""; 
       boolean isImage=false; 
       String nombreFichero = fileName.toLowerCase(); 
       String extension = nombreFichero.substring(nombreFichero.lastIndexOf(".")+1); 
       if (extension.equals("jpg") || 
        extension.equals("jpeg") || 
        extension.equals("JPG") || 
        extension.equals("JPEG")) { 
        myContentType="image/jpeg"; 
        isImage=true; 
       } 
       else if (extension.equals("gif") || extension.equals("GIF")) { 
        myContentType="image/gif"; 
        isImage=true; 
       } 
       else if (extension.equals("png") || extension.equals("PNG")) { 
        myContentType="image/png"; 
        isImage=true; 
       } 
       else if (extension.equals("doc") || extension.equals("DOC") || 
          extension.equals("rtf") || extension.equals("RTF")) { 
        myContentType="application/msword"; 
       } 
       else if (extension.equals("bin") || 
          extension.equals("exe")) { 
        myContentType="application/octet-stream"; 
       } 
       else if (extension.equals("zip")) { 
        myContentType="application/x-zip"; 
       } 
       else if (extension.equals("pdf")) { 
        myContentType="application/pdf"; 
       } 
       else if (extension.equals("txt")) { 
        myContentType="text/plain"; 
       } 
       else if (extension.equals("xls")) { 
        myContentType="application/ms-excel"; 
       } 
       else if (extension.equals("ppt")) { 
        myContentType="application/ms-powerpoint"; 
       } 
       response.setContentType(myContentType); 
       if (isImage) { 
        BufferedImage im = ImageIO.read(new ByteArrayInputStream(contenido));       
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output); 
        //JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(im); 
        //param.setQuality(1.0f,true); 
        //encoder.encode(im, param); 
        encoder.encode(im); 
       } else { 
        output.write(contenido); 
       } 
       output.flush(); 
       output.close(); 
      } 
     } 
     else{ 
      output.println("No se puede conectar con el servidor de archivos<br>"); 
     } 
    } 

    return null; 
} 

Затем на JSPs, где мне нужно, чтобы отобразить снимки, которые я просто сделать это:

<img class="pic" alt="Foto destacada" src="descargarFichero.do?fileName=<c:out value="${foto.nombre}"/>/thumb_<c:out value="${foto.nombre}"/>"/> 

Акция «descargarFichero.do "вызывает метод, который я опубликовал.

Моя дикая догадка заключается в том, что есть некоторая проблема с кодировкой JPG, но я мало знаю об этих вещах, поэтому я с радостью слышу (читаю) ваши предложения.

Помните, что только некоторые из фотографий показывают темный, не все из них, я ищу проблемные файлы, но пока не нашел ничего подозрительного.

Большое спасибо

P.S. Другой метод, который вы, возможно, потребуется

public byte[] downloadFile(String filename) { 
    byte downloadfile[] = null; 
    try { 
     byte buffer[]; 
     File file = new File(filename); 
     if(file.exists() || (!file.isDirectory())) { 
      buffer = new byte[(int)file.length()]; 
      BufferedInputStream input = new BufferedInputStream(new FileInputStream(filename)); 
      input.read(buffer, 0, buffer.length); 
      input.close(); 
      downloadfile = buffer; 
     } else { 
      //break MISSING_BLOCK_LABEL_65; 
      return null; 
     } 
    } catch(Exception exception) { 
     //System.out.println("FileImpl: " + e.getMessage()); 
     exception.printStackTrace(); 
     return null; 
    } 
    return downloadfile; 
} 
+0

Любая причина не возвращать файл, как есть? Все современные браузеры могут обрабатывать gif, jpg и png. Так почему вы загружаете их в свой сервлет, чтобы перекодировать их как jpg? –

+1

Боковые заметки: вы можете сразу заменить два первых 'if'' 'if (fileName! = Null)'. Если вы используете 'fileName.toLowerCase()', вам не нужно проверять, равна ли строка 'jpg || JPG', но только для 'jpg'. – sp00m

+0

Возможно, это проблема подключения по сети? Проводили ли вы какие-либо тесты, чтобы убедиться, что это причина? – Thihara

ответ

0

Следуя @EJP и советы @GuillaumePolet, я сделал это:

... 
response.setContentType(myContentType); 
BufferedImage im = ImageIO.read(new ByteArrayInputStream(contenido));       
output.write(contenido); 
output.flush(); 
output.close(); 
... 

Я пропустил JPG перекодирования часть, и она работала очень хорошо. Также исправлен какой-то уродливый код, используя предложения по другим комментариям (я не размещаю его здесь, потому что это действительно не связано с проблемой, с которой я столкнулся).

Большое спасибо за ваш вклад!

Смежные вопросы