Большая картинка и PictureBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Большая картинка и PictureBox

Сообщение Tin » 19.04.2006 (Ср) 6:54

Проблема такая в PB рисуется БОЛЬШАЯ картинка (больше чем 4000*4000). Проблема такая - бэйсик не дает ауторедроу для ПБ больших чем 4000*4000... А картинку из ПБ в последствиии надо сохранить...
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 19.04.2006 (Ср) 8:57

А можно код рисования в PB_Paint и в нем SavePicture?
Моду создают модоки, а распространяют модозвоны.

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 19.04.2006 (Ср) 9:04

Вообщем, размер ПБ допустим 300*300, но картинка в него должна нарисоваться 5000*5000, а потом сохраниться (например так: SavePicture BigPallete.Image, App.Path & "\1.bmp"). Так как SavePicture сохраняет только видимую часть, то и 1.bmp будет размером 300*300, а не 5000*5000. Если сделать ПБ изначально размером 5000*5000, то ВБ даст ошибку о том, что не может в картинке такого размера использовать AutoRedraw
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 19.04.2006 (Ср) 9:45

Tin А откуда берётся картинка 5000х5000? открывается из другого файла и просто пересохраняется или ещё и модифицируется а потом пересохраняется?
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 19.04.2006 (Ср) 9:47

Составляется из других картинок размером 300*300
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 19.04.2006 (Ср) 9:53

1. попробуй .picture=.image
2. свойство .AutoRedraw = True

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

Сообщение CodeName33 » 19.04.2006 (Ср) 9:54

Tin, Тут лучше написать функцию которая будет размножать напрямую в файл. Я так в своё время делал, когда надо было размножить маленькую какртинку до 10000х10000 чтобы использовать как текстуру потом. PB тут не подойдёт, видеопамяти не хватит. 10000х10000 - это 300метров видеопамяти надо. Поэтому я напрямую в BMP на диск размножал маленькую картинку. Исходники дома, щас приложить не могу... Может вечером если только.
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 19.04.2006 (Ср) 10:33

2Sirik - не помогает
2CodeName33 - было бы не плохо...
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 19.04.2006 (Ср) 10:36

ты лучше напиши функцию, которая собирает картинку

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 19.04.2006 (Ср) 10:42

В цикле от X 0 до temp.width и y так же идет рисование картинки...
Что тут непонятного...
Код: Выделить всё
BitBlt BigPallete.hDC, X * 300, Y * 300, 300, 300, Temp2.hDC, 0, 0, SRCCOPY
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.04.2006 (Ср) 10:52

Если ты картинку через API множишь, почему бы тебе не работать с виртуальным hDC и не сохранять его сразу в файл?
Lasciate ogni speranza, voi ch'entrate.

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 19.04.2006 (Ср) 10:56

А можно чуточку по подробнее... плз
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение BV » 19.04.2006 (Ср) 14:17

2 Tin

Для просмотра рисуй на малом DC только выделенный RECT, а копируй его со своего DC в памяти, ибо у PictureBox на такие рисунки памяти не хватит.

Смотри BitBlt/CreateCompatibleBitmap/CreateCompatibleDC
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 » 19.04.2006 (Ср) 21:20

Tin, к сожалению исходник моей проги утерян, как и сама прога исчезла за ненадобностью. Может если будет на работе время - наклепаю по быстренькому.
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 7:58

2BV - огромное спасибо, разобрался...

Осталась только одна проблема - как сохранить картинку их Hdc в файл?
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 20.04.2006 (Чт) 9:21

А вот и примерчик накатал. Размножает картинку прямо в файл и пямяти много не требует. Создаёт новый файл ИМЯ_СТАРОГО_ФАЙЛА.bmp
Вложения
TexTiler.zip
(2.76 Кб) Скачиваний: 33
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 9:35

Конечно здорово... Но если картинки будут разные, то это усложнит данную программу....
А через АПИ на прямую никак не получится ХДС сохранить?
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 20.04.2006 (Чт) 9:59

Tin, ну тогда остаётся по аналогии моей программы написать свой BitBlt напрямую в файл - и вопрос решится.
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 10:04

Через чур сложнй алгоритм получится...

ЗЫ Не мог бы прокоментировать строчки по бмп формату, может быть через ДиБитс получится решить проблему...
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 20.04.2006 (Чт) 10:23

'Все структуры и обьявления в моём примере.

LW = RGBWidth(NW) 'Ширина строки картинки выровняная в 4 байта
BFH.bfType = 19778 'Тип BMP
BFH.bfOffBits = Len(BFH) + Len(bih)
BFH.bfSize = BFH.bfOffBits + LW * NH 'Размер файла - заголовки + ширина в байтах*высота
Put #F, Pos, BFH 'Пишем в файл
Pos = Pos + Len(BFH)

bih.biSize = Len(bih) 'Размер структуры
bih.biWidth = NW 'Ширина
bih.biHeight = NH 'Высота
bih.biPlanes = 1 'Это всегда 1
bih.biBitCount = 24 'Количество бит
bih.biCompression = 0 'Без сжатия
bih.biSizeImage = 0 'Всегда 0
Put #F, Pos, bih 'Пишем в файл
Pos = Pos + Len(bih)

'Дальше пишутся сами данные картинки.
'Строки в обратном порядке типа:
'строка 3: 1[BGR] 2[BGR] 3[BGR]...
'строка 2: 1[BGR] 2[BGR] 3[BGR]...
'строка 1: 1[BGR] 2[BGR] 3[BGR]...
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 10:39

Так... Вроде бы понял... Спасибо... Будем воевать дальше, если что опять спрошу что-нить :)
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 20.04.2006 (Чт) 13:02

Код: Выделить всё
Private Declare Function OleCreatePictureIndirect Lib "oleaut32" (ByRef lpPictDesc As PicBmp, riid As GUID, ByVal fOwn As Long, ByRef lplpvObj As Any) As Long

Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

Private Type PicBmp
  Size As Long
  Type As PictureTypeConstants
  hBmp As Long
  hPal As Long
  Reserved As Long
End Type

Public Function GetPicture(ByVal hPic as long) As IPictureDisp 
  Dim p As PicBmp, g As GUID
 
  With p
    .hBmp = hPic
    .Size = Len(p)
    .Type = vbPicTypeBitmap
  End With
 
    With g
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
  End With
 
   OleCreatePictureIndirect p, g, 0, GetPicture
End Function


Использование:
Код: Выделить всё

SavePicture GetPicture(hBitmap), "pathtofile"
Если всё делать своими ручками, они скоро отвалятся !

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 13:15

2Kovu - это не спасает - вылетает ошибка Out of memory, т.е. SavePicture не может сохранять большие картинки
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 15:45

И опять я со своими помидорами... Вообщем попытался я из ДС (в котором теоретически находится изображение около 5000*5000) вытащить цвет точки (через гет пиксел - он как раз их ДС вытаскивает цвет) и я получаю результат, что якобы ДС мой пустой... Чушь какая-та
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 20.04.2006 (Чт) 16:22

Уффф... Переработал свой пример, написал функцию BitBlt в BMP файл. Вроде отсечения нормально работают, но н всякий случай проверь с разными X,Y,XSrc,YSrc. Правда не поддерживаются константы наложения, типа vbSrcCopy и т.д. но можно поработать и доделать и их...
Вложения
TexTilerV2.zip
(3.34 Кб) Скачиваний: 31
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 20.04.2006 (Чт) 16:29

Реально! Щас попробуем воплотить в жизнь! Спасибо за такое активное участие
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 21.04.2006 (Пт) 11:44

А вот что из этого получилось... Правда ещё сырой вариант, но...
Вложения
1.rar
(965.25 Кб) Скачиваний: 28
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 21.04.2006 (Пт) 12:13

Tin, я тоже в своё время делал программу которая делает фотку из фоток. Только у меня 10000х10000 была, на медленных компах не открывалась даже...
Программисты не глючат - глючат компиляторы...

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 21.04.2006 (Пт) 12:17

у меня она где-то 15000*14000, только я её уменьшил для форума :)
У тебя нет идей, как писать избавиться от открывания картинки в ПБ и чтения его цветов, а читатать на прямую из БМП файла?
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

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

Сообщение CodeName33 » 21.04.2006 (Пт) 12:31

Tin, есть конечно! Я просто не знал, что тебе из BMP читать надо. Думал источником может быть любой файл изображения поддерживаемый VB.

Вот, проверь работоспособность, я не проверял, в браузере накатал. Работет только с BMP 24 Bit.

Код: Выделить всё
Public Function CreateFromBMP24(ByVal FN As String, ByRef Spr() As Byte, ByRef W As Integer, ByRef H As Integer, Optional Pos As Long = 1)
Dim F As Long, T As Long, B As Byte
Dim BFH As BITMAPFILEHEADER, bih As BITMAPINFOHEADER

F = FreeFile
Open FN For Binary Access Read As #F
  Get #F, Pos, BFH
  Get #F, Pos + Len(BFH), bih
  If Not bih.biBitCount = 24 Then GoTo Erro
  W = bih.biWidth
  H = bih.biHeight
 
  ReDim Spr(1 To RGBWidth(W), 1 To H) As Byte
  Get #F, Pos + Len(BFH) + Len(bih), Spr()
Erro:
Close #F
End Function
Программисты не глючат - глючат компиляторы...


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

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 115

    TopList  
cron