Вы пытаетесь присвоить String
(s) a Charset
, но вам действительно нужно извлечь bytes
с определенным Charset
И, кстати, вам не нужно все это
final byte[] bytes = "Анна Меркулова".getBytes("windows-1251");
final String result = new String(bytes);
Из командной строки можно использовать jpeginfo, чтобы узнать, ли jpeg файл в порядке или нет.
JFIF N 15332$ jpeginfo-c test.jpeg
test.jpeg 260 x 264 24 битов [хорошо]
Это должно быть тривиально для вызова jpeginfo от php.
Мое самое простое (и самое быстрое) решение:
function jpeg_file_is_complete($path) {
if (!is_resource($file = fopen($path, 'rb'))) {
return FALSE;
}
// check for the existence of the EOI segment header at the end of the file
if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
fclose($file);
return FALSE;
}
fclose($file);
return TRUE;
}
function jpeg_file_is_corrupted($path) {
return !jpeg_file_is_complete($path);
}
Примечание: это обнаруживает только поврежденную файловую структуру, но НЕ обнаруживает поврежденные данные изображения.
Вы также можете попробовать генерировать файловый хеш на основе MD5 и использовать его в качестве контрольной суммы для проверки данных JPEG на различных шагах. Например, после чтения из файла, затем после передачи и т. Д.
К вашему сведению - я использовал метод выше ( jpeg_file_is_complete
) , чтобы проверить файлы JPEG, которые, как я знаю, повреждены (например, когда я загружаю их в браузере, нижняя часть становится серой, т. е. изображение «обрезано»). Во всяком случае, когда я запустил вышеуказанный тест на этом изображении, он НЕ обнаружил его как поврежденный.
Пока что использование imagecreatefromjpeg ()
работает, но не очень быстро. Я обнаружил, что использование jpeginfo
также работает для обнаружения этих типов поврежденных изображений и БЫСТРЕЕ, чем imagecreatefromjpeg
(я провел тест на моем PHP, используя microtime ()
]).