Я не знаю, почему результат отличается в разных системах, хотя код имеет недостатки, и я подозреваю, что он как-то связан с наблюдаемым поведением.
while (0 <= in.read(bytes, 0, 1024)) {
out.write(bytes);
}
Должно быть:
int count;
while ((count = in.read(bytes, 0, 1024)) > 0) {
out.write(bytes, 0, count);
}
В противном случае есть [высокий] шанс «мусора» в конце, который может объяснить размытость, в зависимости от программы, которая пытается просмотреть [поврежденный] файл изображения. (Размер массива, используемого в качестве буфера, не изменяется - следует записывать только столько данных, сколько было записано в него.)
Удачного кодирования.