Java — отправить изображение с Android-части и получить его с ПК, но изображение повреждено

Я пытаюсь отправить jpeg изображение с моего телефона Android через разъем и с ПК, получить отправленные данные и сохранить их в jpg файл.

Я уверен, что правильно настроил сокет, так как я могу загружать данные (двоичные файлы) с ПК на Android и сохранять их правильно.

Я также могу прочитать поток, который отправляется с Android на ПК. Длина пакета и информация заголовка именно то, что я ожидаю.

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

Вот мой код Android, который пытается отправить файл изображения после отправки информации заголовка:

try{
//packagesize is header information which is sent in advance
index.putInt(packagesize);

byte c[]= {index.get(3),index.get(2),index.get(1),index.get(0)};

InputStream jpgimage = new FileInputStream(fileimage);

dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());

int writeBytes = 0,len = 0;
byte buffer[] = new byte[1024];

while((len = jpgimage.read(buffer,0,buffer.length))!=-1)
{
writeBytes+=len;
dataOutputStream.write(buffer,0,len);

}

dataOutputStream.flush();
jpgimage.close();
dataInputStream.close();
dataOutputStream.close();

...
...
...
}
catch statements here

Это код получения в части ПК:

    // after reading header information I try to read image data

char *buff = malloc(sizeof(char) * jpeg_length);

unsigned int byteCount = 0;
unsigned int byteCount = 0;
do
{
int ret = recv(socket, buff+readBytes, jpeg_length-readBytes, 0);
if (ret <= 0)
{
fprintf(stderr,"Error receiving jpeg file.\n");
fclose( output );
return 106;
}
readBytes += ret;

fwrite(buff, sizeof(char), readBytes, output);
}
while (readBytes < jpeg_length);

fclose( output );

Я также должен отметить, что принимающая часть работает нормально, когда я отправляю данные изображения с клиентским приложением ПК, которое является чистым C++,

Есть ли представление о том, в чем проблема и почему я получаю испорченную отправку изображения с устройства Android?

Ценить это.

отредактированный
Я добавляю это приложение для Android для тестирования, могут ли отправляющие байты образовывать хорошее изображение или нет? Я сохранил изображение, и все было в порядке.

int writeBytes = 0,len = 0;
byte buffer[] = new byte[1024];
// Here I save all sending bytes to an image called test.jpg
String path = "sdcard/download/images/test.jpg";
FileOutputStream stream = new FileOutputStream(path);

while((len = jpgimage.read(buffer,0,buffer.length))!=-1)
{
writeBytes+=len;
stream.write(buffer);
dataOutputStream.write(buffer,0,len);
dataOutputStream.flush();

}
stream.flush();

dataOutputStream.flush();
jpgimage.close();
dataInputStream.close();
dataOutputStream.close();

0

Решение

Я думаю, что вы должны использовать Bitmap класс для преобразования вашего изображения в ByteBuffer а затем отправить его через и на другом конце преобразовать ByteBuffer изображать.

На стороне отправителя

Bitmap bitmap = BitmapFactory.decodeFile("ImageD2.jpg");
int bytes = bitmap.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bitmap.copyPixelsToBuffer(buffer);
byte[] array = buffer.array();

Теперь вы можете отправить byte[] как нормальные данные.

На приемной стороне

получить массив и преобразовать его обратно в Bitmap

 Bitmap bitmap = BitmapFactory.decodeByteArray(array , 0, array .length);

Для получения дополнительной информации вы можете прочитать следующие вопросы

Преобразование растрового изображения в ByteArray Android

Как преобразовать байтовый массив в растровое изображение

0

Другие решения

Я нашел решение для этого. Проблема была со стороны Android. Поэтому я сделал следующие изменения:

Я изменился DataOutputStream а также DataInputStream в BufferedOutputStream а также BufferedInputStream соответственно:

try{
//packagesize is header information which is sent in advance
index.putInt(packagesize);

byte c[]= {index.get(3),index.get(2),index.get(1),index.get(0)};

InputStream jpgimage = new FileInputStream(fileimage);

dataOutputStream = new BufferedOutputStream(socket.getOutputStream());
dataInputStream = new BufferedInputStream(socket.getInputStream());

int writeBytes = 0,len = 0;
byte buffer[] = new byte[1024];

while((len = jpgimage.read(buffer,0,buffer.length))!=-1)
{
writeBytes+=len;
dataOutputStream.write(buffer,0,len);

}

dataOutputStream.flush();
jpgimage.close();
dataInputStream.close();
dataOutputStream.close();

...
...
...

}
ловить заявления здесь

0

По вопросам рекламы [email protected]