Страница: 1 | 2 |
Вопрос: Сохранение изображения в переменной
Добавлено: 06.10.07 19:05
Автор вопроса: Programmer
Есть картинка в PictureBox, необходимо сохранить ее в переменную, не обращяясь к диску(могут перехватить, а программа у меня для хранения паролей), также интересует - как потом загрузить ее обратно? При этом ес-но нельзя использовать LoadPicture и SavePicture. Еще одно: переменная должна быть текстовая, что-бы можно было зашифровать как текст и сохранить в файл. Заранее спасибо!
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
»VladikComper«
ICQ: 419668582
Вопросов: 23
Ответов: 147
Web-сайт:
Профиль | | #1
Добавлено: 06.10.07 19:15
Я знаю два способа:
1. Буфер обмена
2. Unicode. В нем все сиволы сохраняются
Peremenia = StrConv([тест из рисунка], vbUnicode)
Номер ответа: 2
Автор ответа:
Mr.Smile
ICQ: 427682013
Вопросов: 14
Ответов: 464
Профиль | | #2
Добавлено: 06.10.07 19:32
Можно перебрать рисунок попиксельно и загнать данные в массив!
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 06.10.07 23:47
Сохранение:
1. Создать IStream
2. IPicture::SaveAsFile
Загрузка
1. Создать IStream
2. OleLoadPicture
Пример загрузки есть, сохранение по аналогии написать самому труда, думаю, не составит.
' Проект : OfflineClient
' Процедура : PictureFromMemory
' Описание : Получение IPicture из массива
' Кем создан : SNE
' Дата-Время : 15.11.2004-21:45:57
'
' Параметры : btData() - Данные картинки
'--------------------------------------------------------------------------------
Public Function PictureFromMemory(ByRef btData() As Byte) As IPicture
Dim IID_IPicture(15) As Byte
Dim pGlobal As Long, pStream As IUnknown
Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
pGlobal = GlobalAlloc(0&, UBound(btData) + vbNull)
Call CopyMemory(ByVal pGlobal, btData(0), UBound(btData) + vbNull)
If CreateStreamOnHGlobal(pGlobal, True, pStream) = 0& Then
If CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture(0)) = 0& Then
Call OleLoadPicture(ByVal ObjPtr(pStream), UBound(btData) + vbNull, False, IID_IPicture(0), PictureFromMemory)
End If
End If
If PictureFromMemory Is Nothing Then _
Call GlobalFree(pGlobal)
End Function
Номер ответа: 4
Автор ответа:
Programmer
Вопросов: 71
Ответов: 246
Профиль | | #4
Добавлено: 07.10.07 15:51
что такое IPicture? Не встречал такого за несколько лет практики(у меня VB6).
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 08.10.07 01:30
IPicture это интерфейс реализуемый в StdPicture, если интересно
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 08.10.07 01:54
жесть вопрос используй GetDIBBits, получишь массив пикселов. его можно криптонуть и сохранить на диск. далее при загрузке раскриптануть, и SetDIBBits.
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 08.10.07 12:49
rascal
нене, это не тема
vb6 COM ориентирован
GetDIBBits только bmp-шки и получать, а так можно и жпег и гиф и бмп, и wmf
Номер ответа: 8
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #8
Добавлено: 08.10.07 17:49
рисуем картинку в контекст. и чтаем биты
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 08.10.07 18:26
биты, битмап - сходство
вобщем не суть важно
Номер ответа: 10
Автор ответа:
Programmer
Вопросов: 71
Ответов: 246
Профиль | | #10
Добавлено: 09.10.07 16:12
У кого-нить есть пример использования GetDIBBits и SetDIBBits? Что-то я не очень представляю...
Номер ответа: 11
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #11
Добавлено: 09.10.07 16:29
pixels_data = new BYTE [width * height * 4];
BYTE* compr = new BYTE [width * height * 4];
CreateBitmapInfoStruct(img_bmp);
int retval = GetDIBits(img_dc, img_bmp, 0, (WORD) height, pixels_data, &bmi, DIB_RGB_COLORS);
compressed_size = lzwc.Compress((BYTE*)pixels_data, compr, height * width * 4);
//LoadCompressedFile ( HDC& DC, HBITMAP& BMP, char* strPath, int& width, int& height)
Bitmap* lBitmap = new Bitmap ((const WCHAR*) wszPath);
Color color(0, 0, 0, 0);
HDC tmp_dc;
HBITMAP tmp_bmp;
DC = CreateCompatibleDC(GetDC(0));
tmp_dc = CreateCompatibleDC(GetDC(0));
width = lBitmap->GetWidth();
height = lBitmap->GetHeight();
BMP = CreateCompatibleBitmap(GetDC(0), lBitmap->GetWidth(), lBitmap->GetHeight());
//BMP тот же, что и img_bmp выше
SelectObject(DC, BMP);
rez = lBitmap->GetHBITMAP(color, &tmp_bmp);
SelectObject(tmp_dc, tmp_bmp);
BitBlt (DC, 0, 0, lBitmap->GetWidth(), lBitmap->GetHeight(), tmp_dc, 0, 0, SRCCOPY);
DeleteObject (tmp_dc);
DeleteObject(tmp_bmp);
CreateBitmapInfoStruct взята из мсдн
Номер ответа: 12
Автор ответа:
Programmer
Вопросов: 71
Ответов: 246
Профиль | | #12
Добавлено: 09.10.07 16:55
Pa$cal, непонял, при чем тут GetDIBBits? Если можно, пожалуйста, пример на VB. Я в Дельфи не очень ориентируюсь.
Номер ответа: 13
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #13
Добавлено: 09.10.07 18:31
1) почитай про HDC, HBITMAP. Это основы gdi.
2) Это с++
На вб все сводится к вызову тех же функций. Создание dc & hbitmap, сохранение туда изображения, получение битов пикселей. главное проблемко - img_bmp. поля должны быть заполнены. там их много, но в мсдн есть функа CreateBitmapInfoStruct, которая все это делает. Далее вызываем GetDIBBits и получаем в буфере пикселы. От языка зависит наверное только оформление передачи параметров по ссылке.
На вб у меня такого нету, но попробуй гуглить CreateBitmapInfoStruct + vb
Номер ответа: 14
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #14
Добавлено: 09.10.07 18:31
зы, ещё раз ниг исказишь - будет личный игнор.
Номер ответа: 15
Автор ответа:
Programmer
Вопросов: 71
Ответов: 246
Профиль | | #15
Добавлено: 09.10.07 19:18