Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Как загрузить изображение с WEB страницы, не используя его URL адрес

16.06.2013, 01:16. Показов 4485. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: есть адрес веб-страницы, на которой расположена картинка.
Эта картинка при обновлении страницы меняется (скажем так - это каптча с постоянным URL-адресом).

Как программно сохранить ее на диск?
Для работы со страницей использую объект "InternetExplorer.Application"

Не по теме:


С Webbrowser какие-то проблемы. При проверке свойств .busy и .readystate иногда с вероятностью 50 % появляется ошибка "object does not support this property or method".



Я нашел класс для работы с кешем, но пока не разобрался,
как ним пользоваться и умеет ли он "вытягивать" картинки.

Кликните здесь для просмотра всего текста
Visual Basic
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
Option Explicit
 
Private Const LMEM_FIXED As Long = &H0
Private Const LMEM_ZEROINIT As Long = &H40
 
Private Type FILETIME
    lLowDateTime As Long
    lHighDateTime As Long
End Type
 
Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type
 
Private Type INTERNET_CACHE_ENTRY_INFO
   dwStructSize As Long
   lpszSourceUrlName As Long
   lpszLocalFileName As Long
   CacheEntryType As Long
   dwUseCount As Long
   dwHitRate As Long
   dwSizeLow As Long
   dwSizeHigh As Long
   LastModifiedTime As FILETIME
   ExpireTime As FILETIME
   LastAccessTime As FILETIME
   LastSyncTime As FILETIME
   lpHeaderInfo As Long
   dwHeaderInfoSize As Long
   lpszFileExtension As Long
   dwExemptDelta As Long
End Type
 
Private Declare Function FindFirstUrlCacheEntry Lib "wininet.dll" Alias "FindFirstUrlCacheEntryA" ( _
        ByVal lpszSearchPattern As String, _
        ByVal lpCacheInfo As Long, _
        lpdwFirstCacheEntryInfoBufferSize As Long) As Long
    
Private Declare Function FindNextUrlCacheEntry Lib "wininet.dll" Alias "FindNextUrlCacheEntryA" ( _
        ByVal hEnumHandle As Long, _
        ByVal lpCacheInfo As Long, _
        lpdwNextCacheEntryInfoBufferSize As Long) As Long
 
Private Declare Function FindCloseUrlCache Lib "wininet.dll" ( _
        ByVal hEnumHandle As Long) As Long
        
Private Declare Function GetUrlCacheEntryInfo Lib "wininet.dll" Alias "GetUrlCacheEntryInfoA" ( _
        ByVal lpszUrlName As String, _
        ByVal lpCacheInfo As Long, _
        lpdwCacheEntryInfoBufferSize As Long) As Long
 
Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" ( _
        ByVal lpszUrlName As String) As Long
    
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" (ByVal RetVal As String, ByVal Ptr As Long) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function LocalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal uBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long
  
Private hEnumHandle As Long
Private ci As INTERNET_CACHE_ENTRY_INFO
Private lPtrCI As Long
 
Public Property Get CachedEntryCacheType() As Long
    CachedEntryCacheType = ci.CacheEntryType
End Property
 
Public Property Get CachedEntryExpireTime() As Date
On Local Error Resume Next
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.ExpireTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryExpireTime = dExpire
End Property
 
Public Property Get CachedEntryFileExtension() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = Space(250)
    lReturnValue = PtrToStr(strData, ci.lpszFileExtension)
    If lReturnValue Then
        iPosition = InStr(strData, Chr(0))
        CachedEntryFileExtension = Left$(strData, iPosition - 1)
    End If
End Property
 
Public Property Get CachedEntryLastAccessTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastAccessTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastAccessTime = dExpire
End Property
 
Public Property Get CachedEntryLastModifiedTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastModifiedTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastModifiedTime = dExpire
End Property
 
Public Property Get CachedEntryLastSyncTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastSyncTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastSyncTime = dExpire
End Property
 
Public Property Get CachedEntryFileName() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = String$(lstrlenA(ByVal ci.lpszLocalFileName), 0)
    lReturnValue = lstrcpyA(strData, ci.lpszLocalFileName)
    If lReturnValue Then CachedEntryFileName = strData
End Property
 
Public Property Get CachedEntrySourceURL() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = String$(lstrlenA(ci.lpszSourceUrlName), 0)
    lReturnValue = lstrcpyA(strData, ci.lpszSourceUrlName)
    If lReturnValue Then CachedEntrySourceURL = strData
End Property
 
Public Function DeleteCacheEntry(SourceUrl As String) As Boolean
Dim lReturnValue As Long
    lReturnValue = DeleteUrlCacheEntry(SourceUrl)
    DeleteCacheEntry = CBool(lReturnValue)
End Function
 
Public Function FindEntryInCache(Url As String) As Boolean
Dim lReturnValue As Long, lSizeOfStruct As Long
    lReturnValue = GetUrlCacheEntryInfo(Url, 0&, lSizeOfStruct)
    If lPtrCI Then LocalFree lPtrCI
    lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
    If lPtrCI Then
        CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
        lReturnValue = GetUrlCacheEntryInfo(Url, lPtrCI, lSizeOfStruct)
        CopyMemory ci, ByVal lPtrCI, Len(ci)
        LocalFree lPtrCI
    End If
    FindEntryInCache = CBool(lReturnValue)
End Function
 
Public Function FindFirstCacheEntry() As Boolean
Dim lSizeOfStruct As Long
    If hEnumHandle <> 0 Then FindCloseUrlCache hEnumHandle
    hEnumHandle = FindFirstUrlCacheEntry(vbNullString, 0&, lSizeOfStruct)
    If lPtrCI Then LocalFree lPtrCI
    lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
    If lPtrCI Then
        CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
        hEnumHandle = FindFirstUrlCacheEntry(ByVal vbNullString, lPtrCI, lSizeOfStruct)
        CopyMemory ci, ByVal lPtrCI, Len(ci)
    End If
    FindFirstCacheEntry = CBool(hEnumHandle)
End Function
 
Public Function FindNextCacheEntry() As Boolean
Dim lReturnValue As Long, lSizeOfStruct As Long
    If hEnumHandle <> 0 Then
        lReturnValue = FindNextUrlCacheEntry(hEnumHandle, 0&, lSizeOfStruct)
        If lPtrCI Then LocalFree lPtrCI
        lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
        If lPtrCI Then
            CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
            lReturnValue = FindNextUrlCacheEntry(hEnumHandle, lPtrCI, lSizeOfStruct)
            CopyMemory ci, ByVal lPtrCI, Len(ci)
        End If
        If lReturnValue <> 0 Then FindNextCacheEntry = CBool(lReturnValue)
    End If
End Function
 
Private Sub Class_Terminate()
    If hEnumHandle Then Call FindCloseUrlCache(hEnumHandle)
End Sub


Еще нашел код, который копирует в буфер сам объект Image.
Он у меня на веб-странице такой 1. Фильтром находится правильно. Имеет тип HTMLImg ("[Object HTMLImageElement]")
Но при попытке добавления к ControlRange объекта HTMLImg получаю ошибку: "object does not support this property or method".

Кликните здесь для просмотра всего текста
Visual Basic
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
Sub Command1_Click()
 
    Dim sURL As String: sURL = "https://eu.battle.net/account/creation/tos.html?country=RUS"
 
    Dim appIE As Object 'SHDocVw.InternetExplorer
    Set appIE = CreateObject("InternetExplorer.Application")
 
    With appIE
        .Navigate sURL
        .Visible = True
        '.Silent = True
        '.FullScreen = True
 
        Do While (.Busy Or .readyState <> 4): DoEvents: Loop
 
        Dim D As Object 'MSHTML.HTMLDocument
        Set D = .Document
 
    End with
 
    'Dim f As Object
    'Set f = D.getElementById("sec-string") '// input captcha
 
    'D.Forms("creation").All("captchaInput").Value = "captchaDecode"
 
        Dim x, ctrlRange
        
        For Each x In appIE.Document.All
            If UCase(x.tagName) = UCase("IMG") Then
            '    If InStr(1, UCase(x.src), UCase(imgurl), 1) > 0 Then
                    Stop
                    Set ctrlRange = appIE.Document.body.createControlRange()
                    'Debug.Print x.tagName, x.src
                    ctrlRange.Add (x)
                    Clipboard.Clear
                    ctrlRange.execCommand ("Copy")
                    SavePicture Clipboard.GetData, App.Path & "\1.bmp" ' is used to save the picture to your hard drive
                    Picture1.Picture = Clipboard.GetData
                    Stop
                    'Exit For
            '    End If
            End If
        Next
 
end sub
3
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2013, 01:16
Ответы с готовыми решениями:

Загрузить url открытой web страницы в memo
привет, я хотел загрузить активный url в memo. нужно загрузить url открытой web страницы в memo у меня есть код, который выводит url...

Не могу загрузить изображение по его URL адресу в битмап
Не получается загрузить изображение по его URL адресу в Bitmap, минуя imageView (т.к. попадая туда, приходится создавать еще один битмап,...

Есть необходиомость загрузить html-документ (URL задан), и сохранить его на сервере (Web)
Есть необходиомость загрузить html-документ (URL задан), и сохранить его на сервере (Web) Как это сделать средствами ASP?

1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.06.2013, 04:43  [ТС]
Лучший ответ Сообщение было отмечено The trick как решение

Решение

P.S. Не очень актуально.

Сделал на Си-решётке:

Кликните здесь для просмотра всего текста
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
using System;
using mshtml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace Battle_net_Download_Captcha_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        [ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
        private interface IHTMLElementRenderFixed
        {
            void DrawToDC(IntPtr hdc);
            void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
        }
 
 
        void GetImage(string id)
        {
            HtmlDocument D = webBrowser1.Document;
            
            HtmlElement e = D.GetElementById(id);
 
            int i = 0;
 
            MessageBox.Show("Процедура");
 
            //foreach (mshtml.IHTMLImgElement img in webBrowser1.Document.Images)
            //{
            //    MessageBox.Show("Картинка");
 
            HtmlElementCollection collection = D.Images;
            foreach (HtmlElement c in collection)
            {
                MessageBox.Show(c.Id);
 
                IHTMLImgElement img = (IHTMLImgElement)c.DomElement; // e.DomElement (for parsed element)
                IHTMLElementRenderFixed render = (IHTMLElementRenderFixed)img;
 
                Bitmap bmp = new Bitmap(img.width, img.height);
                Graphics g = Graphics.FromImage(bmp);
                IntPtr hdc = g.GetHdc();
                render.DrawToDC(hdc);
                g.ReleaseHdc(hdc);
 
                bmp.Save("C:\\temp\\captcha" + i + ".png");
 
                MessageBox.Show("Готово");
 
                i ++;
            }
            //return bmp;
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("https://eu.battle.net/account/creation/tos.html?country=RUS");
        }
 
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
                return;
 
            while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                //System.Threading.Thread.Sleep(100);
            }
 
            //captchaInput
            //Bitmap img = GetImage("sec-string");
 
            GetImage("sec-string");
        }
    }
}


За бугром одни недопилки и примеры с urldownload.

Может, кому будет интересно допилить на VB6 через BltBlt по примеру выше.
5
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2013, 04:43
Помогаю со студенческими работами здесь

Как загрузить изображение в pictureboх и сохранить его четкость после его растяжения?
Как загрузить точечное изображение в pictureboх, и чтобы после его растяжения сохранить его четкость или сделать его четким?

Как с библиотекой xNet или без нее получить URL адрес страницы?
Сделал авторизацию вконтакте, хочу искусственно получить токен через приложение, суть в том, что после нажатия кнопки разрешить (на...

Как получить весь URL path и загрузить его в код?
Привет Уважаемые форумчане. Пытаюсь построить свой HTTPSERVER и застрял на самом важном, никак не могу загрузить URL в код. ...

Как загрузить изображение на сайт не меняя его названия
Добрый вечер! у меня есть загрузчик изображений, но в нем у меня при сохранении в папку и в базу меняется имя его. Как можно в коде...

Вытащить URL адрес страницы
Через Post запрос передаю html странице логин и пароль от личного кабинета. Сайт после получения логина и пароля формирует URL (каждый раз...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru