Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 131

Bitmap запакованный в jpg под Windows не распаковывается в Android

10.06.2017, 11:13. Показов 846. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пересылаю через сеть по UDP транспорту
виндовс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
class BMP2JPG
{
private:
    IStream *inStream;
    IStream *outStream;
    void *inBuf;
    void *outBuf;
    CLSID   encoderClsidJPG;
    CLSID   encoderClsidBMP;
    Gdiplus::Image *img;
    Gdiplus::Bitmap* GdiplusImageToBitmap(Gdiplus::Image* img, Gdiplus::Color bkgd = Gdiplus::Color::Transparent)
    {
        int wd = img->GetWidth();
        int hgt = img->GetHeight();
        auto format = img->GetPixelFormat();
        Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(wd, hgt, format);
 
        if (bmp == nullptr)
            return nullptr; 
 
        auto g = std::unique_ptr<Gdiplus::Graphics>(Gdiplus::Graphics::FromImage(bmp));
        g->Clear(bkgd);
        g->DrawImage(img, 0, 0, wd, hgt);
 
        return bmp;
    }
 
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
    {
        UINT  num = 0;          // number of image encoders
        UINT  size = 0;         // size of the image encoder array in bytes
 
        Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
 
        Gdiplus::GetImageEncodersSize(&num, &size);
        if (size == 0)
            return -1;  // Failure
 
        pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
        if (pImageCodecInfo == NULL)
            return -1;  // Failure
 
        Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
 
        for (UINT j = 0; j < num; ++j)
        {
            //wprintf(L"%s\n", pImageCodecInfo[j].MimeType);
            if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
            {
                *pClsid = pImageCodecInfo[j].Clsid;
                free(pImageCodecInfo);
                return j;  
            }
        }
 
        free(pImageCodecInfo);
        return -1;  // Failure
    }
    unsigned char* GetImage(DWORD &imgSize,CLSID *decoder)
    {
        unsigned char *ret = new unsigned char[1024 * 1024];
        img->Save(outStream, decoder);
        LARGE_INTEGER liZero = { 0 };
        ULARGE_INTEGER pos = { 0 };
        outStream->Seek(liZero, STREAM_SEEK_CUR, &pos);
        //printf("%d\n", pos.QuadPart);
        imgSize = pos.QuadPart;
        ZeroMemory(&liZero, sizeof(LARGE_INTEGER));
        ZeroMemory(&pos, sizeof(ULARGE_INTEGER));
        outStream->Seek(liZero, STREAM_SEEK_SET, &pos);
        DWORD r = 0;
        outStream->Read(ret, 1024 * 1024, &r);
        ZeroMemory(&liZero, sizeof(LARGE_INTEGER));
        ZeroMemory(&pos, sizeof(ULARGE_INTEGER));
        outStream->Seek(liZero, STREAM_SEEK_SET, &pos);
        //printf("%d\n", 0);
        img->~Image();
        return ret;
    }
public:
    BMP2JPG()
    {
        inBuf = GlobalAlloc(GMEM_FIXED, 1024 * 1024);
        outBuf = GlobalAlloc(GMEM_FIXED, 1024 * 1024);
        CreateStreamOnHGlobal((HGLOBAL)inBuf, TRUE, &inStream);
        CreateStreamOnHGlobal((HGLOBAL)outBuf, TRUE, &outStream);
        //printf("%d",GetEncoderClsid(L"image/jpeg", &encoderClsid));
        GetEncoderClsid(L"image/jpeg", &encoderClsidJPG);
        GetEncoderClsid(L"image/bmp", &encoderClsidBMP);
    }
    ~BMP2JPG()
    {
        inStream->Release();
        outStream->Release();
        //GlobalFree(inBuf);
        //GlobalFree(outBuf);
    }
    void PutImage(unsigned char *data,DWORD dataSize)
    {
        DWORD w = 0;
        LARGE_INTEGER liZero = { 0 };
        ULARGE_INTEGER pos = { 0 };
        inStream->Seek(liZero, STREAM_SEEK_SET, &pos);
        inStream->Write(data, dataSize, &w);
        this->img = new Gdiplus::Image(inStream);
    }
    void PutImage(HBITMAP bmp)
    {
        Gdiplus::Bitmap *dummy = new Gdiplus::Bitmap(bmp, NULL);
        this->img = dummy;
    }
    unsigned char* GetJPG(DWORD &dataSize)
    {
        return this->GetImage(dataSize, &encoderClsidJPG);
    }
    unsigned char* GetBMP(DWORD &dataSize)
    {
        return this->GetImage(dataSize, &encoderClsidBMP);
    }
    HBITMAP GetHBITMAP()
    {
        //this->img->get
        Gdiplus::Bitmap *bmp = this->GdiplusImageToBitmap(this->img);
        HBITMAP hb = NULL;
        bmp->GetHBITMAP(Gdiplus::Color::Transparent, &hb);
        bmp->~Bitmap();
        return hb;
    }
};
обработка в андроид
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
public class VideoActivity extends Activity 
{
    private ImageView jpgViwer;
    
    private class NetWorker implements Runnable
    {
        private DatagramSocket dsocket;
        private byte[] udpBuffer;
        private DatagramPacket packet;
        private boolean doRun=true;
        private Handler dataExchanger;
        private boolean dataEtxracted=true;
        @Override
        public void run() 
        {
            // TODO Auto-generated method stub
            for(;;)
            {
                if(doRun==false){return;}
                else
                {
                    try 
                    {
                        if(dataEtxracted == true)
                        {
                            dsocket.receive(packet);
                            dataExchanger.sendEmptyMessage(0);
                            dataEtxracted = false;
                        }
                    } 
                    catch (IOException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        public NetWorker(Handler dataEx)
        {
            dataExchanger = dataEx;
            udpBuffer = new byte[1024*64];
            try 
            {
                dsocket = new DatagramSocket(2000);
                packet = new DatagramPacket(udpBuffer, udpBuffer.length);
            } 
            catch (SocketException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void Stop()
        {
            doRun = false;
        }
        public int ExtractData(byte[] dataBuf)
        {
            if(dataEtxracted == false)
            {
                System.arraycopy(dataBuf,0, packet.getData(), 0, packet.getData().length);
                return packet.getLength();
            }
            return 0;
        }
        public void PrepareToExtract()
        {
            if(dataEtxracted == false)
            {
                dataEtxracted  = true;
            }
        }
    }
    private NetWorker netThr;
    
    private class HandleReceiver extends Handler
    {
        private byte [] buffer;
        private int DataLen=0;
          @Override
          public void handleMessage(Message message)
          {
              buffer = new byte[1024*64];
              DataLen=netThr.ExtractData(buffer);
              DrawFrame(buffer,DataLen);
              buffer = null;
              netThr.PrepareToExtract();
          }
          
          /*public HandleReceiver()
          {
              buffer = new byte[1024*64];
          }*/
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        jpgViwer=(ImageView)findViewById(R.id.imageView1);
        netThr = new NetWorker(new HandleReceiver());
        Thread t = new Thread(netThr);
        t.start();
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.video, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
      @Override
      protected void onStop() 
      {
        super.onStop();
        netThr.Stop();
      }
    public void DrawFrame(byte []jpgData,int dataLen)
    {
        Bitmap frame = BitmapFactory.decodeByteArray(jpgData, 0, dataLen);
        if(frame!=null)
        {
            jpgViwer.setImageDrawable(new BitmapDrawable(frame));
        }
        else
        {
            Toast.makeText(getApplicationContext(),String.valueOf(dataLen) , Toast.LENGTH_SHORT).show();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2017, 11:13
Ответы с готовыми решениями:

Есть задача - написать FTP сервер под телефон (android) и клиент под ПК(Windows)
Здраствуйте. Есть задача - написать FTP сервер под телефон (android) и клиент под ПК(Windows). Я, мягко говоря, плаваю в этой...

Как запихнуть JPG в Bitmap
Народ объясните плз как запихнуть JPG в Bitmap, чтобы потом его можно было обрабатывать? И как получать быстрый доступ к цвету в пикселе?

Windows 7 распаковывается 24 часа
В общем проблема состоит в следующем. При переустановке операционной системы всё идёт нормально до того как начинается распаковка файлов...

1
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
12.06.2017, 11:01
лог ошибки?
код - отстой
форматирование ужасное, куча вложенных классов, читать невозможно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.06.2017, 11:01
Помогаю со студенческими работами здесь

Приложения windows из под Android
Есть необходимость запустить приложение на мобильном устройстве. Казалось бы задача наипростейшая, ставится эмулятор винды и всё, но.......

Разработка под Android и Windows
Добрый день. Написал приложение на Android, использовал Android Studio. Приложение на Java. Можно ли каким-либо образом...

Перенос приложения из Windows под Android
требуется написание проги под андроид, которая есть в windows. уточняю: есть прога на винде самописанная, она написана на дэльфи, и...

Разработка android - приложения в Qt 5.2.1 под windows 8.1
Доброе время суток, дорогие форумчане! Есть проблема! Стоит windows 8.1 и qt 5.2.1, с помощью qt quick 2.0 создал простое приложение, после...

Сохранить фото из bitmap в формате jpg на sdcard или внутреннюю память телефона Андроид
Здравствуйте! Может кто сталкивался с таким вопросом. Есть TImage в него с камеры грузится фото. Потом мне надо сохранить его под нужным...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru