Сохранить пиксел в файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сохранить пиксел в файл

Сообщение K.Sergey » 19.02.2005 (Сб) 19:33

Помогите!

Есть код цвета. Нужно этот цвет сохранить в файл в виде одного пиксела (ну, или несколько, но чтобы они все были этого же цвета)...

Заранее спасибо!
Life is what happens to us when we are planning to do something else...

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

Сообщение Amed » 19.02.2005 (Сб) 19:37

Самый простой способ - кинуть на форму PictureBox размером 1х1 пикселя, потом Pset'ом в точку (0,0) кинуть нужный цвет и вызвать SavePicture.

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

Сообщение Amed » 19.02.2005 (Сб) 19:40

Код: Выделить всё
Private Sub Form_Load()
Picture1.AutoRedraw = True
Picture1.Move 250, 250, 16 * 5, 16 * 5
Picture1.Line (0, 0)-(16 * 5, 16 * 5), RGB(255, 0, 0), BF
Picture1.Picture = Picture1.Image
SavePicture Picture1.Picture, "C:\123.bmp"
End Sub

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.02.2005 (Сб) 19:46

Самый простой способ - кинуть на форму PictureBox размером 1х1 пикселя, потом Pset'ом в точку (0,0) кинуть нужный цвет и вызвать SavePicture.


Спасибо за наводку, но на самом деле, я планировал это использовать также и в VBA проектах. А там нет PictureBox. Есть ли какой-нибудь другой способ, который работал бы и в VBA?
Life is what happens to us when we are planning to do something else...

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

Сообщение Amed » 19.02.2005 (Сб) 19:50

Роем в сторону формата .bmp файлов... Сейчас дам наводку на статеечку...

А суть в том, что мы ручками слепим bmp-файлик с одним-единственным (а, может, и не единственным) пикселем нужного цвета...

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

Сообщение Amed » 19.02.2005 (Сб) 19:52

http://graphics.cs.msu.ru/courses/cg99/ ... bmpfmt.htm
Подсказки нужны? Вроде бы, всё достаточно чётко расписано...

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.02.2005 (Сб) 19:57

http://graphics.cs.msu.ru/courses/cg99/notes/lect3/bmpfmt.htm
Подсказки нужны? Вроде бы, всё достаточно чётко расписано...

Был бы бесконечно благодарен за подсказки, т.к. ничего не понял... :cry:
Life is what happens to us when we are planning to do something else...

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

Сообщение Amed » 19.02.2005 (Сб) 20:23

Открываем файл для двоичного доступа
Код: Выделить всё
Open "C:\123.bmp" For Binary As #1

Пишем в него данные побайтно согласно таблице данных bmp-шника...
Код: Выделить всё
Put #1, 1, "B"
Put #1, 2, "M"
'...
'и так далее
'...


Когда доходим до таблицы цветов, заполняем только 1 нужный нам цвет, остальные можно оставить нулевыми
А в разделе "BITMAP DATA" вообще будет только 1 байт со значением "0" (если картинка у нас 1х1)...
И не забываем закрыть файл
Код: Выделить всё
Close #1
Последний раз редактировалось Amed 19.02.2005 (Сб) 22:17, всего редактировалось 3 раз(а).

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

Сообщение tyomitch » 19.02.2005 (Сб) 20:53

Chr("B") - это шедевр... Может, исправишь? :-)
Изображение

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 19.02.2005 (Сб) 20:55

tyomitch писал(а):Chr("B") - это шедевр... Может, исправишь? :-)
Это точно! :D
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.02.2005 (Сб) 21:21

Amed, спасибо за наводку. Пойду разбираться (первый раз встречаюсь с побайтным составлением файла). Если у кого есть пример, был бы благодарен...
Life is what happens to us when we are planning to do something else...

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

Сообщение Amed » 19.02.2005 (Сб) 21:32

tyomitch писал(а):Chr("B") - это шедевр... Может, исправишь? :-)


А-а, так вот что мне бросалось в глаза ;)
В затылочной части мозга звенит тревога, а откель звон, не пойму ;)

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

Сообщение tyomitch » 19.02.2005 (Сб) 22:08

FTR, всё ещё неправильно: Asc возвращает Integer, и ты записываешь два байта. Надо просто
Код: Выделить всё
Put #1, 0, "B"
Put #1, 1, "M"
'...
'и так далее
'...
Изображение

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

Сообщение Amed » 19.02.2005 (Сб) 22:16

Действительно, проверил...
Если писать
Код: Выделить всё
Put #1, 1, Asc("B")

(кстати, начинать надо не с 0 байта, а с 1), то указатель перейдёт сразу на байт 3, минуя 2...

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

Сообщение tyomitch » 20.02.2005 (Вс) 0:20

Последний раз редактировалось: Amed (20.02.2005 (Вс) 01:17), всего редактировалось 3 раз(а)

Теперь вроде всё правильно... "Three times is a charm" (c)
Изображение

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

Сообщение Amed » 20.02.2005 (Вс) 11:45

Три раза - это ещё ничего... Мне препод как-то на экзамене по АГ (аналитической геометрии) заявил
"Медведев! Ладно бы вы запутались в трёх соснах, но ведь вы запутались в одной сосне!"

А K.Sergey что-то молчит... Если Вам всё ещё непонятно, то порекомендую вот что (ещё одна наводка): сделать
Код: Выделить всё
Private Sub Form_Load()
Picture1.AutoRedraw = True
Picture1.Move 250, 250, 16 * 5, 16 * 5
Picture1.Line (0, 0)-(16 * 5, 16 * 5), RGB(255, 0, 0), BF
Picture1.Picture = Picture1.Image
SavePicture Picture1.Picture, "C:\123.bmp"
End Sub

Потом открыть C:\123.bmp хекс-вьювером и записывать побайтно такие же циферки в код записи в файл ;)
Заменять надо только в двух местах - первый цвет палитры и первый пиксель (а может, и только в одном)...

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

Сообщение tyomitch » 20.02.2005 (Вс) 13:27

В BMP, создаваемых VB, нет палитры. (так, к сведению)
Изображение

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

Сообщение Amed » 20.02.2005 (Вс) 13:29

Гы )
Сейчас не хочется копаться, вечером исследую, как и что...

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

Сообщение tyomitch » 20.02.2005 (Вс) 13:38

Палитра есть только в 8-и-меньше-битных BMP. VB их сохраняет с экранным разрешением. Поскольку никто сейчас не сидит с разрешением 8 бит, то это будет 16-и-более.
Изображение

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

Сообщение Amed » 20.02.2005 (Вс) 13:40

Ты имеешь в виду, что вся палитра заполнена нулями, а каждый пиксель определён 2 и более байтами согласно описанию (слева направо сверху вниз)? Или палитры в этом случае вообще нет?

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

Сообщение tyomitch » 20.02.2005 (Вс) 14:02

Вообще нет - зачем же хранить столько нулей?
А ещё, BMP обычно хранятся снизу вверх :-)
Изображение

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

Сообщение Amed » 20.02.2005 (Вс) 14:15

А! И верно!

Как-то писал криптопрограмму. Она зашивала файл внутрь bmp-картинки так, чтобы не было видно, что что-то внутрь записано. Получалась картинка с чуть подпорченными отдельными пикселями, вроде шума. Тогда пришлось изучить формат bmp-шника... Сейчас пойду найду исходник, и выложу в Наши проекты =)


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 178

    TopList