Показать полную графическую версию : [решено] Изображение в коде
xNiSSaNx
17-04-2012, 23:11
Каким способом изображение хранится в машинном коде, ну или в 16ричном. Например есть изображение 2х2 пикселя, я открывая НЕХ редактором, и если от панта изменить, открываю вижу что фото или вобще поменялось цвета, а не один пиксель, вобщем вопрос в том, что же и как хранится. Наверное Дата создания, имя. Но код прописан не на каждый цвет пикселя, таки ли это?
xNiSSaNx, изображение хранится не в «машинном коде», и не в «16ричном», а в своём формате: Графические форматы — Википедия (http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1 %82%D1%8B). Определяйтесь с конкретным форматом Вашего изображения и затем отсюда «танцуйте».
Есть представление изображения при их использовании приложением, например IPicture interface (http://msdn.microsoft.com/en-us/library/windows/desktop/ms680761(v=vs.85).aspx).
xNiSSaNx
18-04-2012, 13:22
Так оно же в НЕХ редакторе открывается. Например .рng
Оно и в блокноте отрывается, вы лучше прочитайте про графические форматы
В ФАЙЛЕ ХРАНИТСЯ КАЖДЫЙ ПИКСЕЛЬ. Как хранится, указывается в заголовке формата.
Если изображение 2x2 на 2 пикселя, то в формате BMP один пиксель будет занимать 4 байта. то есть последовательность 00 00 00 00, по другому называемая DWORD-ом или int-ом или long-ом, где 1 байт это R (red, красный) компонента цвета, 1 байт это G ( green, зеленый) компонента цвета, 1 байт это B ( blue, синяя) компонента цвета. Остаток - нули для выравнивания по определенному размеру, который сможет понять программа, считывающая файл. Каждый пиксель должен хранится в определенном формате, иначе программа не сможет считать файл правильно.
Хранится в битах. Бит принимает значение либо 0, либо 1. Из-за железа компьютера, которое работает на основе двоичной (булевой) логики.
8 бит составляют 1 байт. Набор из 8 битов может принимать значения от 00 до ff шестнадцатеричных. Например, 11111111 это FF при просмотре в 16-ричном редакторе. FF в десятичной системе это 255.
Программа записывает и считывает файл побайтово. В начале файла находится заголовок с описанием формата и различных характеристик файла. Затем непосредственно набор структур, описывающих изображение. Если изображение 2 на 2 пикселя то формат файла это заголовок + набор данных о пикселах.
Анализ структуры:
Например, заголовок BMP
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // смещение 0 от начала файла
DWORD bfSize; // смещение 2 от начала файла, длина 4
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits; // смещение 10 от начала файла, длина 4
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
В шеснадцатеричном виде BYTE это 8 бит, WORD это 16 бит, DWORD это 32 бита.
Структура при записи в файл примет вид: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 где вместо нулей - шестнадцатеричные цифры, которые принимают набор предопределенных программой значений.
Я написал, но сомневаюсь, что без дополнительных вопросов и объяснения, у автора темы будет понимание.
***
Прочитать легко - понять гораздо сложнее, очень трудно. Непонятное обычно пропускается. И чтение без понимания википедии или другого сайта ничего не даст. Лучше бы пытались объяснить своими словами и попроще не программисту. Ссылки на другие сайты без попыток объяснить своими словами так чтобы человек понял, бесполезны. Человек без опыта и подготовки статью о BMP в википедии не поймет, так как понятие DWORD или WORD ему ничего не даст, они являются неизвестными. неизвестность рождает непонимание, непонимание не дает сделать то, что надо. Советы почитать - абсолютно БЕСПОЛЕЗНЫ!!! Нужно объяснять, когда человек спрашивает а не отправлять в гугл, на википедию или на другие сайты. Человек останется в своем одиночестве и ничего не поймет, на форум приходят, чтобы люди отвечали по-людски, а не для того, чтобы их отправляли читать википедию или другие сайты, оставляя однострочные комментарии или приколы. На форуме не камеди клаб.
Лучше бы пытались объяснить своими словами и попроще не программисту. Ссылки на другие сайты без попыток объяснить своими словами… »
Всё Вы правильно говорите. Но пока человек не наберёт базовых знаний в той или иной предметной области — от которых он будет отталкиваться при дальнейшем обучении — никакими словами объяснить ему детали Вы не сможете, тем паче, что «свои слова», как правило, будут много хуже выверенных и подобранных слов специалистов своего дела в учебниках и энциклопедиях.
Вот, что мы здесь наблюдаем в первом посте? Незнание тех самых базовых понятий, которые порождают попросту бессмысленную постановку вопроса, на который невозможно дать конкретный ответ как раз по причине его бессмысленности. Это давно известный случай — «Чтобы получить правильный ответ — нужно задать правильный вопрос. Чтобы задать правильный вопрос — нужно знать большую часть ответа.» Плюс ко всему, автор задаёт не конкретный вопрос, а общего характера, без каких-либо деталей. Потому главная задача — задать ему направление, где бы он мог обозреть всю картину в целом, освоиться в данной предметной области, получить тот самый базовый набор знаний, который поможет ему мало-мальски начать ориентироваться и начать задавать правильные вопросы.
Нужно объяснять, когда человек спрашивает а не отправлять в гугл, на википедию или на другие сайты. »
Во-первых, в «гугл» автора никто пока не отправлял, поскольку сие рано по изложенным выше причинам. А вот Wikipedia — самое оно. И если:
понятие DWORD или WORD ему ничего не даст »
автору не знакомо (несмотря на использование им hex-редактора) — он может просто перейти на соответствующие статьи и узнать, что это такое. Или Вы полагаете, что объяснение: «последовательность 00 00 00 00, по другому называемая DWORD-ом или int-ом или long-ом» действительно лучше объяснения, приведённого (http://ru.wikipedia.org/wiki/BMP) в Wikipedia? Ничего, что длина «последовательности» зависит напрямую от глубины цвета, и пиксель в данном формате изображения может быть представлен последовательностью от одного до сорока восьми бит, а?
пиксель в данном формате изображения может быть представлен последовательностью от одного до сорока восьми бит, а? »а при использовании RLE для пикселов разных цветов может отличаться и длина последовательности, для пиксела одного цвета 2 бита, для другого цвета 8 бит
Amigos, именно. И ещё целая куча всяческих тонкостей. И потому мне не очень понятны предубеждения коллеги mrcnn против «почитать учебники».
Всё Вы правильно говорите. Но пока человек не наберёт базовых знаний в той или иной предметной области — от которых он будет отталкиваться при дальнейшем обучении — никакими словами объяснить ему детали Вы не сможете, тем паче, что «свои слова», как правило, будут много хуже выверенных и подобранных слов специалистов своего дела в учебниках и энциклопедиях. »
В целом во многом я сами согласен. Вы правы в том, что пишете насчет набора базовых знаний.
Однако есть одна проблема: выверенные слова специалистов из учебников и статей очень наукообразные и для понимания нужно объяснять попроще, искать какие-нибудь простые аналогии из разных областей жизни ( из других предметных областей), чтобы объяснение было более доступным. Человек может читать книгу и не понять ее в итоге по причине наукообразности. На форуме же могут объяснить доступно и в этом как мне кажется и есть задача ответов на форуме, где нельзя отсылать по разным местам
Я занимаюсь программированием как хобби примерно 10-11 лет. И простую вещь, что В ФАЙЛЫ ЗАПИСЫАЮТСЯ (например, функцией fwrite языка С) СТРУКТУРЫ (типы данных объявляемые как struct или class в языке C)и СЧИТЫВАТЬ НАДО ТОЖЕ СТРУКТУРЫ (например, функцией fread языка С) я понял лишь на 10-11 году, то есть в этом году, и я постарался на это указать в своем ответе в этом теме. Помимо этого простую вещь, что накладывать на экран, можно область текстуры а не всю текстуру я тоже понял лишь на 10-11 году. Разница между пониманием у новичка, что текстура полностью накладывается и пониманием у специалиста про наложение области существенная. Это подразумевающиеся в статьях, книгах и учебниках вещь и их надо объяснять отдельно, иначе будет непонимание. Новичку надо указывать путь, последовательность важных тем, потому что новичок не сможет выделить главное и второстепенное. И потонет во множестве мелких деталей, а цельной картины мира не будет. Задача обучения и вопросов - составление цельной картины мира, где разные части взаимосвязаны друг с другом. Одна предметная область зависит от другой, то есть все системно взаимосвязано друг с другом. Нужно указывать прямо зачем нужны битовые операции, как работает компьютер, причем не наукообразным языком. 0 в программировании значит, что электрического тока в электрической цепи нет. А 1 значит, что электрический ток в цепи есть. И микропроцессор занимается преобразованием токов внутри самого себя и этим осуществляет арифметические и логические операции. Связь по слотам между устройствами это тоже передача тока по определенному каналам - это простая вещь, но в книгах по прогарммированию не объясняют.
Правильные вопросы у новичка возникают после попыток объяснения. Без попыток объяснения не будет даже самих вопросов - будет просто незнание и непонимание. Человек займется совсем другим делом, а на то, с чем хотел разобраться, забьет, то есть бросит. Нужно ввести и пояснить термины, без них новичок просто бросит, то есть даже не задаст вопросы совсем.
xNiSSaNx
20-04-2012, 00:03
mrcnn все понятно объяснил. Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.