Я наткнулся на эту проблему сегодня, позвольте мне объяснить проблему: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;
}
Любая причина не возвращать файл, как есть? Все современные браузеры могут обрабатывать gif, jpg и png. Так почему вы загружаете их в свой сервлет, чтобы перекодировать их как jpg? –
Боковые заметки: вы можете сразу заменить два первых 'if'' 'if (fileName! = Null)'. Если вы используете 'fileName.toLowerCase()', вам не нужно проверять, равна ли строка 'jpg || JPG', но только для 'jpg'. – sp00m
Возможно, это проблема подключения по сети? Проводили ли вы какие-либо тесты, чтобы убедиться, что это причина? – Thihara