Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1419 / 826 / 310
Регистрация: 17.05.2015
Сообщений: 3,171
1

С# BitmapImage byte[] to java Bitmap

29.04.2019, 22:43. Показов 519. Ответов 4
Метки нет (Все метки)

Изображение класса BitmapImage (можно переделать и в System.Drawing.Bitmap - но я уверен не поможет) записывается в массив байт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 private byte[] BitmapImageToByteArray(BitmapImage img)
        {
            if (img == null) return new byte[2];
            byte[] data;
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(img));
            using (MemoryStream ms = new MemoryStream())
            {
                encoder.Save(ms);
                data = ms.ToArray();
            }
            return data;
        }
Затем принимается на java в андроид студии и формируется изображение
Java
1
Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, bitmapdata.length);
Но все это дело виснет в недрах метода decodeByteArray.
Проблема в том, что байты в С# только положительные 0-255. А в java байты - signed
https://stackoverflow.com/ques... -java-byte
Вот тема с аналогичной проблемой.
Единственное решение которое я нашел
-6 in java can be 256+(-6) = 250 in C#
Как лучше решить эту проблему?

П.С. количество байт, контрольная сумма - проверяется, дело именно в том что java неверно интерпретирует байты из С#
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2019, 22:43
Ответы с готовыми решениями:

WinRT. Конвертировать BitmapImage в byte[]
Есть набор картинок представляющих из себя byte зашифрованный Base64 алгоритмом. Требуется их...

Массив byte в объект Bitmap
Возникла следующая проблема: никак не могу получить картинку (объект Bitmap) из массива byte...

Преобразовать byte[] в Bitmap или другой формат, пригодный для pictureBox
Ситуация такая: клиент отправляет на сервер изображения, находящееся в своём pictureBox,...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

4
3027 / 2148 / 1070
Регистрация: 14.08.2016
Сообщений: 7,330
30.04.2019, 01:09 2

Не по теме:

явно не по теме, но все же, подготовка к пересылке

Цитата Сообщение от Рядовой Посмотреть сообщение
if (img == null) return new byte[2];
* * * * * * return data;
"как 2 байта переслать":D


по теме, а что конкретно приходит в яву?может есть некая корреляция?
0
Фрилансер
798 / 305 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
30.04.2019, 03:57 3
Цитата Сообщение от Рядовой Посмотреть сообщение
байты в С# только положительные 0-255. А в java байты - signed
в c# есть и знаковые байты. тип sbyte.
Цитата Сообщение от Рядовой Посмотреть сообщение
-6 in java can be 256+(-6) = 250 in C#
C#
1
2
byte b = 250;
sbyte sb = (sbyte)b; //sb = -6
Или, еще вариант, преобразовывать байты на стороне c# в int:
C#
1
2
byte b = 250;
int i = b < 128 ? b & 127 : b | -128; //i = -6
и передавать в яву как int[], а на стороне явы уже int в byte конвертировать
0
1419 / 826 / 310
Регистрация: 17.05.2015
Сообщений: 3,171
30.04.2019, 07:20  [ТС] 4
Цитата Сообщение от Diamante Посмотреть сообщение
что конкретно приходит в яву?может есть некая корреляция?
приходит массив значений -128 до +128. В конец сообщения я записываю 2 контрольных байта - 0 и 255, java их принимает как 0 и -1...
asn31337, этот вариант к сожалению отпадает. связь между приложениями организована через сокеты, на которые можно отправлять только тип byte. При попытке отправить sbyte или int он их будет пытаться преобразовать в байты.

Добавлено через 6 минут
Diamante, еще со стороны явы я отправляю условный байт о готовности на примем - 14. С# его так и принимает.
0
261 / 222 / 108
Регистрация: 09.12.2015
Сообщений: 652
30.04.2019, 09:11 5
Цитата Сообщение от Рядовой Посмотреть сообщение
Проблема в том, что байты в С# только положительные 0-255. А в java байты - signed
Тот факт, что C# и Java по-разному интерпретируют байты не означает, что информация в этих байтах необратимо искажается.
Это можно легко проверить:
C#
1
2
3
4
5
6
7
8
9
10
11
for(int i = 0; i < 256; ++i)
{
   byte b1 = (byte)i;
   sbyte s1 = (sbyte)b1;
   byte b2 = (byte)s1;
   Console.WriteLine($"{b1}\t {s1}\t {b2}");
   if(b1 != b2) //это условие никогда не выполнится
   {
      throw new Exception();
   }
}
Кликните здесь для просмотра всего текста
С# BitmapImage byte[] to java Bitmap

Цитата Сообщение от Рядовой Посмотреть сообщение
Но все это дело виснет в недрах метода decodeByteArray.
Возможно, что проблемы именно с форматом JPEG (граната не той конструкции).
Попробуйте сохранять в формате PNG PngBitmapEncoder.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2019, 09:11

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Byte в java
Здравствуйте! Почему при преобразовании int s = 250; System.out.println((byte)s); в...

Тип byte[] в java
Всем привет! Разбираюсь с работой с файлами в Java. И в коде встретил такую запись private byte...

Пустой байт в byte Java Jssc
public static String code; public static int i = 0; public static int q = 0; public...

java.io.UTFDataFormatException: malformed input around byte 1
Какая может быть причина возникновения этого исключения? Возникает при попытке считать методом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.