Рейтинг:
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
Да, извините, что я прочитал, и я удалил этот последний мой вопрос отсюда, но, может быть, до конца.