Как показывать на форме около 1000 картинок?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Как показывать на форме около 1000 картинок?

Сообщение Alfa » 17.08.2005 (Ср) 7:48

Появилась необходимость показать на форме около 1000 картинок, причем они должны быть не маленького расширения (около 200 на 100) при расширении экрана 1024 на 768, то есть с помощью ScrollBar'а можно будет просматривать их по очереди. Но картинки большего объема (около 5 мегабайт) и грузяться с Flash-карты, то есть скорость маленькая, так что по очереди их грузить не получится. Возможно ли как-нибудь это реализовать?
Изображение

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 17.08.2005 (Ср) 9:12

Загружаешь первую картинку, а затем по таймеру начинаешь грузить картинки в память или в массив. Допустим открылась первая картинка, а в это время 8 следующих грузятся в память, если ты пролестнул картинку, загружается 10 картинка и так далее ... :idea:
No comments ...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 17.08.2005 (Ср) 10:31

Ну можно их в папку TEMP на винте закешировать
Программисты не глючат - глючат компиляторы...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2005 (Ср) 12:01

CodeName33 писал(а):Ну можно их в папку TEMP на винте закешировать


Кэшировать - это слишком долго.

В предыдущем письме советовали - загружать асинхронно (для этого правда таймер не нужен), просто отдавать события по DoEvents. На месте еще незагруженных картинок рисовать "пустую" - как это делают различные Viewer-ы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 17.08.2005 (Ср) 13:01

Andrey Fedorov, Так тоже можно, но если картинок будет больше, или они каждая будет больше занимать, но пямяти может не хватить, начнёт свапить... Можно кэшировать в пямяти картинок 500 остальные по мере необходимости выгружать збрасывая на винт, чтобы потом быстро загрузить.
Программисты не глючат - глючат компиляторы...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2005 (Ср) 13:06

CodeName33 писал(а):Andrey Fedorov, Так тоже можно, но если картинок будет больше, или они каждая будет больше занимать, но пямяти может не хватить, начнёт свапить...


Не свопить, а закричит об нехватке физической памяти... IMHO.

CodeName33 писал(а):Можно кэшировать в пямяти картинок 500 остальные по мере необходимости выгружать збрасывая на винт, чтобы потом быстро загрузить.


Ну образ уже загруженной картинки можно сохранять в кэше (саму-то картинку не надо - они по 5 Mb могут быть)...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 17.08.2005 (Ср) 13:14

Andrey Fedorov

Не свопить, а закричит об нехватке физической памяти... IMHO.

Ну свапить он всё равно начнёт, но не эту программу а все остальные... :)

Код: Выделить всё
Ну образ уже загруженной картинки можно сохранять в кэше (саму-то картинку не надо - они по 5 Mb могут быть)...

Ну это естественно, если это превьюхи картинок, то не зачем сохрянять саму картинку, а потом снова делать по ней превьюху, а быстрее будет сохранять превьюхи. Просто из вопроса я не понятно, что нужно делать превьюхи больших картинок. Я удивился как это можно сделать картинку 100*200 размером в 5 метров, или это в общей сложности они 5 метров весят...
Программисты не глючат - глючат компиляторы...

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Картинки.

Сообщение Alfa » 17.08.2005 (Ср) 17:13

А как лучше загружать картинки в память, с помощью чего?

И еще такой вопрос: когда делаю StretchBlt с одного Picture на другой с уменьшением, то теряется цвет. Капался как-то в примерах API-Guide'а, сделал так, чтобы цвет не терялся. Но снова не получается, цвет теряется. Как бы избежать этого?

Заранее благодарен.
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 17.08.2005 (Ср) 17:22

Офф
хорошо сказал :thumleft:
Нет меня больше

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.08.2005 (Ср) 17:43

Alfa писал(а):А как лучше загружать картинки в память, с помощью чего?


А как ты это себе представляешь? :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 17.08.2005 (Ср) 22:16

Alfa, В смысле цвет теряется? У тебя что-ли 16 битов выставлено в свойствах экрана?
Программисты не глючат - глючат компиляторы...

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 18.08.2005 (Чт) 0:17

Конечно не в тему, а что уже есть флэшки на 4,88ГБ ?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.08.2005 (Чт) 8:28

Пардон, здесь креки не раздают?

Жаль, жаль, зайду в следующий раз...

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 18.08.2005 (Чт) 9:16

Сходил таки покурил... Придумал еще как можно...
Открываем дир, смотрим скока файлов, присваиваем имена массиву... Грузим первый, второй, третий и т.д. по порядку до тех пор пока не загрузим картинки в видимые пикчуры на форме (к примеру с 1 по 6)... Если какое-то время нет от пользователя никаких действий, начинаем свопить картинки себе в темп (т.к. с винта грузануть быстрее чем с флэшки)... как тока пользователь делает «далее» или «назад», прога подгружает следующие имадьжи в пикчюры, при этом если скажем мы находимся на 20-30 пикчере, можно пикчер 1-10 очистить, т.к. до него добраться нужно будет через 2-3 нажатия «назад»... Соответственно памяти будет жраться меньше, хотя в некоторых случаях будет притормаживать... Или я перекурил сегодня....
Бороться и искать, найти и перепрятать!

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 18.08.2005 (Чт) 12:04

16 битов выставляется не на экране, а в PictureBox'ах, в которые я с помощью StretchBlt копирую изображение с другого PictureBox, при этом в исходном цвет нормальный, 32-битный, но в любой случае в конечных PictureBox'ах получаются 16-битные изображение. С помощью каких-то API я смог сделать их 32-битными (конечные), но сейчас вспомнить не могу.

А на счет загрузки в память. Загрузить в память - это хорошо написать, но меня волнует практическая сторона дело, ибо в Visual Basic'е-то нет функции. Изображение.Абра-Кадабра.Загрузись-В-Память. Надо ли создавать в памяти специальные "ячейки", делать это с помощью VB или API и как вообще это реализовать.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.08.2005 (Чт) 12:25

Загрузить в память:

1) CreateCompatibleDC
2) BitBlt / ...

Серфим интернет на тему пункта №1.

HINT: В апи-гайде даже есть нужный пример.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 18.08.2005 (Чт) 14:32

Может так...
Предположим, что на форме единовременно видно 10 PictureBox, почему бы при нажатии на кнопки вверх/вниз, не загружать 10 следующих или 10 предыдущих картинок в эти PictureBox.

Тогда не будет необходимости загружать кучу файлов сразу и + экономия времени... :D
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 18.08.2005 (Чт) 17:00

Alfa Я понимаю, что это PictureBox тебе в 16 битов конвертит, но он обычно сам так не делает, только есть на экране 16 битов. Попробуй с SetStretchBltMode поиграться. Не должен он цвета портить, если на экране 32 бита стоит.
Программисты не глючат - глючат компиляторы...

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 18.08.2005 (Чт) 21:30

В GDI+ нашел функцию, CreateGraphicsFromImage, которой требуется для создания графики объект формата Image, при этом эта функция может возратить hdc, который мне так нужен для моей функции StretchBlt. Но мне еще нужно загрузить в Image картинку из файла, для этого использую CreateImage.
Получаем:
StretchBlt ..., CreateGraphicsFromImage(CreateImage("C:\abc.bmp")).hdc, ...

Проблема в том, что возращенный hdc содержит полностью черное изображение, проверял при помощи GetPixel. В чем проблема?

Вообще, что мне нужно, это загрузить в PictureBox уменьшенную большую картинку. Для этого я сделал другой PictureBox, грузил туда картинку при помощи CreateImage, и уже делал StretchBlt между двумя PictureBox. Но это все было долго, я решил работать с памятью. Поэтому и нашел CreateGraphicsFromImage, но оно почему-то не работает. Может быть кто-нибудь знает, почему?
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 19.08.2005 (Пт) 3:57

Alfa писал(а):Поэтому и нашел CreateGraphicsFromImage, но оно почему-то не работает. Может быть кто-нибудь знает, почему?


Потому что ошибка у тебя в коде

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 19.08.2005 (Пт) 6:42

Было бы очень интересно узнать, где именно.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2005 (Пн) 0:54

Alfa писал(а):В GDI+ нашел функцию, CreateGraphicsFromImage, которой требуется для создания графики объект формата Image, при этом эта функция может возратить hdc, который мне так нужен для моей функции StretchBlt. Но мне еще нужно загрузить в Image картинку из файла, для этого использую CreateImage.
Получаем:
StretchBlt ..., CreateGraphicsFromImage(CreateImage("C:\abc.bmp")).hdc, ...

Проблема в том, что возращенный hdc содержит полностью черное изображение, проверял при помощи GetPixel. В чем проблема?

Кажется, не полностью чёрное, а тёмно-серое (проверять лень).
Но это такая фишка у GDI+: создаваемые ей DC можно использовать только для записи. Я с этим уже обламывался, когда пытался применить к GDI+-картинке FloodFill (аналога ему в GDI+ почему-то нет): так вот, она тоже заливает всю картинку целиком, потому что видит монотонный фон.
Единственный обход для этого - свойство Image::Pixel.

Alfa писал(а):Вообще, что мне нужно, это загрузить в PictureBox уменьшенную большую картинку. Для этого я сделал другой PictureBox, грузил туда картинку при помощи CreateImage, и уже делал StretchBlt между двумя PictureBox. Но это все было долго, я решил работать с памятью. Поэтому и нашел CreateGraphicsFromImage, но оно почему-то не работает. Может быть кто-нибудь знает, почему?

А так, интересно, заработает? :-)
Код: Выделить всё
Set PictureBox.Picture = CreateImage("картинка.bmp").GetThumbnailImage(100, 100).Picture
Изображение

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 22.08.2005 (Пн) 8:15

Да, работает так:
Set PictureBox.Picture = CreateImage("картинка.bmp").GetThumbnailImage(100, 100).Picture
и так:
Set PictureBox.Picture = CreateImage("картинка.bmp").Picture

Но возникла еще одна проблема:
Чтобы загружать изображение быстрее мне советывали копировать уже маленькие картинки в память, что я и пытаюсь сделать вот так:
Код: Выделить всё
hMemoryDC2 = CreateCompatibleDC(p(i).hdc)
hOldBitMap = SelectObject(hMemoryDC2, p(i).Picture)
BitBlt hMemoryDC2, 0, 0, 192, 144, p(i).hdc, 0, 0, vbSrcCopy
dhdc(some-thing-value) = hMemoryDC2

когда первый раз загружаю изображение из памяти, потом (процедура та же, но загружена уже в другой раз) же я просто пытаюсь его грузить из памяти в PictureBox:
BitBlt p(i).hdc, 0, 0, 192, 144, dhdc(some-thing-value), 0, 0, vbSrcCopy
но он мне показывает после этого в PictureBox белое поле с черным прямоугольником слева внизу или же просто белое поле.
Почему?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2005 (Пн) 16:47

Alfa, объясни что ты пытаешься сделать. Ты вообще собираешься работать через GDI или GDI+? Или через оба сразу, чтобы никто ничего не понял в твоём коде?
Изображение

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 27.08.2005 (Сб) 12:06

Требуется создать в памяти холст, на который/с которого можно будет копировать/снимать изображение в PictureBox'ы с помощью функций StretchBlt и BitBlt.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.08.2005 (Сб) 16:50

А чем prjGDIplus.Image не подходит в качестве такого холста? И самому создавать ничего не надо.
Изображение

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 27.08.2005 (Сб) 19:38

Требуется создать много холстов в памяти (около 500) и работать с ними в разных процедурах программы продолжительное время - около 10 минут. Потом их все удалить.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.08.2005 (Сб) 20:56

Чем не подходят 500 объектов prjGDIplus.Image :?:
Изображение

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Сообщение Alfa » 28.08.2005 (Вс) 17:21

А как их создавать и получать их hdc?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.08.2005 (Вс) 21:05

Создавать: CreateBitmap(размеры, цветность)
Получать hDC у них не надо. Лучше сделать CreateGraphics(hDC) для источника/приёмника и перекидывать картинки процедурой DrawImageEx. Она заменяет StretchBlt и BitBlt в GDI+
Изображение

След.

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

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

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 64

    TopList