Member 12891988 Ответов: 1

Получить байты от HICON для отправки через сокет от сервера к клиенту


Привет, мне нужно получить байты из дескриптора HICON, но я не знаю, как это сделать.
мне нужно отправить байт с
send(socket, (CHAR*)&Byte_to_send, sizeof(Byte_to_send);
Byte_to_send должен быть байтами, связанными с HICON каждого приложения windows, и я получил его таким образом:
Hicon icon = (HICON)GetClassLong(hWnd, GCL_HICON);

Что я уже пробовал:

send(socket, (CHAR*)&Byte_to_send, sizeof(Byte_to_send);
Byte_to_send должен быть байтами, связанными с HICON каждого приложения windows, и я получил его таким образом:
Hicon icon = (HICON)GetClassLong(hWnd, GCL_HICON);

1 Ответов

Рейтинг:
0

Jochen Arndt

Воспользуйся Функция GetIconInfo (Windows)[^] или Функция GetIconInfoEx (Windows)[^] и отправить эти данные. Для этого необходимо использовать HBITMAP дескрипторы для получения доступа к растровым данным.

Чтобы получить пиксельные данные HBITMAP используйте это для DIB (Device Independent Bitmap):

DIBSECTION ds;
int nSizeDS = ::GetObject(hBitmap, sizeof(ds), &ds);
// hBitmap is a DIB
if (sizeof(ds) == nSizeDS)
{
    // This should not be necessary.
    // But many MSDN examples perform these calculations.
    if (0 == ds.dsBmih.biSizeImage)
    {
        if (0 == ds.dsBm.bmWidthBytes)
            ds.dsBm.bmWidthBytes = ((ds.dsBm.bmWidth * ds.dsBm.bmBitsPixel + 31) & ~31) / 8;
        ds.dsBmih.biSizeImage = ds.dsBm.bmHeight * ds.dsBm.bmWidthBytes;
    }
    // Image data at ds.dsBm.bmBits
    // Data size in ds.dsBmih.biSizeImage
}


Member 12891988

Большое спасибо, я думаю, что решил проблему отправки на стороне сервера:


Hicon icon = (HICON)GetClassLong(hWnd, GCL_HICON);

ICONINFO oIconInfo;
if (:: GetIconInfo(icon, & oIconInfo)= = true){
cout <<"успех!" < & lt;endl;
send(newConnection, (CHAR*)& oIconInfo, sizeof(oIconInfo), NULL);
}еще{
cout <<"неудача!" < & lt;endl;
}


Теперь мне нужно преобразовать поток байтов, считанных с моего клиента (это сделано на c#), который я получил с моего сервера c++, и преобразовать массив байтов в изображение.
Поэтому я попытался сделать это:


Byte [] buffer = новый байт[1500];
СХК.Получите(буфер);
Класса typeconverter ТС = в разделе.GetConverter(typeof(Bitmap));
Bitmap bitmap1 = (Bitmap)tc. ConvertFrom(буфер);
imageList1.Изображения.Добавить (bitmap1);


Когда я пытаюсь это сделать, я получаю ошибку в этой строке:

Bitmap bitmap1 = (Bitmap)tc. ConvertFrom(буфер);


Это сообщение об ошибке, которое я получил:

Необработанное исключение из "системы".Система типов ArgumentException.Drawing.dll
Дополнительная информация: недопустимый параметр.


Я тоже пробовал:

MemoryStream ms = новый MemoryStream (буфер);
Растровое изображение bmp;
bmp = новое растровое изображение (МС);

а этот другой:

ImageConverter ic = новый ImageConverter();
Система.Рисование.Изображение img = (System.Рисование.Изображение) ic. ConvertFrom (буфер);
Растровые bitmap1 = новое растровое изображение(рис);


но я получил то же самое сообщение об ошибке.

Jochen Arndt

Поскольку это связано с C#, я предлагаю открыть новый вопрос.

Чтобы создать растровое изображение, Вам также нужны размер и глубина цвета. Я предлагаю отправить BITMAPINFOHEADER структура тоже (ds.dsBmih из моего примера). Затем передайте соответствующие данные этой структуры в C# Bitmap конструктор, который принимает ширину, высоту, шаг, глубину цвета и массив байтов.

Member 12891988

Привет, спасибо и извините, но я не очень хорошо понял ваш пример, точнее я не понял, что я должен отправить клиенту через сокет.
Я пытался это сделать:

Hicon icon = (HICON)GetClassLong(hWnd, GCL_HICON);

ICONINFO oIconInfo;
if (:: GetIconInfo(icon, & oIconInfo)= = true){
cout <<"успех!" < & lt;endl;
send(newConnection, (CHAR*)& oIconInfo, sizeof(oIconInfo), NULL);
}еще{
cout <<"неудача!" < & lt;endl;
}

Но я не знаю, как послать другого, о котором вы сказали.
Можете ли вы привести простой пример, сочетающийся с моим маленьким решением?
ПС. Мне нужно сделать несколько отправок?
Прежде чем я отправлю это:
send(newConnection, (CHAR*)& oIconInfo, sizeof(oIconInfo), NULL);
и тогда я посылаю:
BITMAPINFOHEADER bitmapinfoheader;
send(newConnection,(CHAR*)& bitmapinfoheader,sizeof(bitmapinfoheader), NULL);

Я не знаю, как это можно сделать практически.

Member 12891988

Я пытался это сделать, но не знаю, как продолжать:

ICONINFO oIconInfo;
DIBSECTION ds;
if (:: GetIconInfo(icon, & oIconInfo)= = true){
HBITMAP hBitmap = oIconInfo.hbmColor;
int nSizeDS = :: GetObject(hBitmap, sizeof(ds), & ds);
// hBitmap - это DIB
if (0 == ds.dsBmih.biSizeImage)
{
if (0 == ds.dsBm.bmWidthBytes)
ДС.dsBm.bmWidthBytes = ((ДС.dsBm.bmWidth * ДС.dsBm.bmBitsPixel + 31) &ампер; ~31) / 8;
ДС.dsBmih.bisizeimage с = ДС.dsBm.bmHeight * ДС.dsBm.bmWidthBytes;
}
send(newConnection, (CHAR*)& oIconInfo, sizeof(oIconInfo), NULL);
}

Jochen Arndt

Смотрите мой ответ на ваш новый вопрос

Jochen Arndt

Вы читали мой ответ на ваш новый вопрос?
ICONINFO не содержит imformation на месте.
Вы должны использовать HBITMAP и получить из него информацию об изображении.
Вы должны отправить информацию (высота, ширина, глубина цвета). Это можно сделать, отправив DIBSECTION beacuse, поскольку он содержит все необходимые данные.
Затем отправьте необработанные данные изображения.

Member 12891988

Да, извините, что я прочитал, и я удалил этот последний мой вопрос отсюда, но, может быть, до конца.