Как загрузить в ОЗУ картинку и работать с ней?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 17:01

Как можно загрузить картинку в оперативную память и к примеру нарисовать на ней круг и показать уже на форме. Суть не в самом рисунке, а в том что картинка должна висеть в памяти и чтобы с ней можно было производить редактирование.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Хакер » 23.02.2015 (Пн) 17:03

Конкретизируй вопрос.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 17:35

Код: Выделить всё
Dim st As IPictureDisp
Set st = LoadPicture(App.Path + "\1.bmp")
pic.Picture = st

в этом коде реализована загрузка в ОЗУ компа, а потом его показывает в PictureBox или нет?

Если да, то я хотел бы загрузив картинку например наложить на нее какую нить дополнительную графику и только потом вывести на PictureBox.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Хакер » 23.02.2015 (Пн) 17:39

Don Leno писал(а):в этом коде реализована загрузка в ОЗУ компа, а потом его показывает в PictureBox или нет?


Какое тебе дело до ОЗУ, если Windows-приложения не работают с ним напрямую?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 17:44

Ок, спасибо за ответ))

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение The trick » 23.02.2015 (Пн) 17:47

Можно вручную рисовать (т.е. изменять данные пикселов по конкретным адресам), либо воспользоваться GDI, GDI+ и т.п. сторонними библиотеками, которые уже имеют кучу готовых функций. Также можно использовать стандартные бейсиковские функции.
Какой нужен?
Если да, то я хотел бы загрузив картинку например наложить на нее какую нить дополнительную графику и только потом вывести на PictureBox.

Самый простой, но самый нехороший способ рисовать на невидимом контроле с Autoredraw = True. А так можешь создать DC и через SelecObject выбрать в него эту картинку. Потом уже пользоваться стандартными GDI функциями, указывая этот контекст. Все функции будут рисовать на данном битмапе.
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Хакер » 23.02.2015 (Пн) 17:48

Что можно сказать о человеке, который в качестве реакции на вопрос говорит фразу «спасибо за ответ»?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 17:50

Трик!! Да вот оно!! Я уже нашел функцию CreateDC но не знал как использовать потом, спс за подсказку)) Ну а если ты уж сможешь выложить простенький эскиз то я тебе буду оч благодарен!!! Я собираюсь использовать BitBlt)))
P.S. Эскиз всмысле пример))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 18:06

Трик, вот нашел использование CreateDc, мож мне пояснить как мне создать "чистую рабочую область", этот пример подходит?
Код: Выделить всё
nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)

Через него я получу контекст, чтобы потом через Селект Обжект занести в него графику?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение The trick » 23.02.2015 (Пн) 18:09

Код: Выделить всё
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Sub Form_Load()
    Dim pic As StdPicture
    Dim hdc As Long
    Dim obp As Long
   
    Set pic = LoadPicture("D:\Temp\Mega.jpg")
    hdc = CreateCompatibleDC(Me.hdc)
    obp = SelectObject(hdc, pic.Handle)
    ' Рисуем круг
    Ellipse hdc, 0, 0, 100, 100
    SelectObject hdc, obp
    DeleteDC hdc
   
    Set Me.Picture = pic
   
End Sub

Для создания чистого "холста" нужно создавать новый битмап (CreateBitmap, CreateCompatibleBitmap, CreateDIBSection - если GDI). Я думаю сейчас актуальней учить GDI+ там больше возможностей, но ниже скорость.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 18:15

Трик и последняя просьба не понимаю этих строчек кода:
Код: Выделить всё
hdc = CreateCompatibleDC(Me.hdc)

то есть если передать "контекст" формы, то на моей форме ничего не покажется (не отрисует графику)?! Он обрабатывает все в памяти и по команде
Код: Выделить всё
Set Me.Picture = pic
Отрисует на форме, так?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как загрузить в ОЗУ картинку и работать с ней?

Сообщение Don Leno » 23.02.2015 (Пн) 18:30

Огромное спасибо код прекрасно заработал и я переписал его под свои нужды!!)))
Вот пример кода вдруг кому пригодится:
Код: Выделить всё
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Const SRCCOPY = &HCC0020

Private Sub Command1_Click()
Dim st As IPictureDisp
Dim lt As IPictureDisp
    Dim hdc As Long
    Dim hst As Long
    Dim hlt As Long
Set st = LoadPicture(App.Path + "\1.bmp")
Set lt = LoadPicture(App.Path + "\2.bmp")

hst = CreateCompatibleDC(Me.hdc)
hlt = CreateCompatibleDC(Me.hdc)

SelectObject hst, st.Handle
SelectObject hlt, lt.Handle
BitBlt hst, 0, 0, 50, 50, hlt, 0, 0, SRCCOPY

SelectObject hst, st

DeleteDC hst
DeleteDC hlt
Form1.Picture = st

End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82

    TopList