Страница: 1 |
|
Вопрос: Тяжёлый вопрос
|
Добавлено: 21.04.04 15:12
|
|
Автор вопроса: cresta
|
Всем здравствуйте. Такое дело: как получить инфу из файла .bmp о высоте, ширине, разрешении(пиксел/дюйм) рисунка. Главным образом интересует расширение. Кто знает, выручайте, очень надо, плиз...
Ответить
|
Номер ответа: 3 Автор ответа: Шпион
ICQ: 250543104
Вопросов: 13 Ответов: 118
|
Профиль | | #3
|
Добавлено: 21.04.04 16:34
|
если не ошибаюсь, в начале файла по адресу &h12 и &h15 разполагаются два DWORD характеризующих размеры картинки. Насчет глубины - не помню
Ответить
|
Номер ответа: 4 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #4
|
Добавлено: 21.04.04 16:54
|
To User Unknown : я говорю не о расширении, а о разрешении. Файл сканирую со сканера, в нем содержится инфа о том, какое было разрешение установлено на сканере в момент сканирования, PhotoShop может определить это, а я не могу и меня жаба душит из-за этого. Размеры уже нашел как определить, а с расширением пока туго. За ссылку спасибо, пойду смотреть.
Ответить
|
Номер ответа: 7 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #7
|
Добавлено: 22.04.04 06:14
|
To User Unknown : ну естественно разрешение, просто опечатка. Ещё написал что (пиксел/дюйм). Расширение в пикселах не измеряется, не правда ли? Но все равно спасибо за ссылку, правда там ничего нет(ссылка битая), но оттуда по поиску нашел то, что надо на abstractvb.com. To Sne: если интересно, кину на мыло. Есть для bmp и jpeg. Правда, jpeg ещё не смотрел. А в bmp можно получить всю инфу.
Ответить
|
Номер ответа: 9 Автор ответа: LamerOnLine
ICQ: 334781088
Вопросов: 108 Ответов: 2822
|
Профиль | | #9
|
Добавлено: 22.04.04 17:25
|
Люди, объясните мне о каком разрешении идет речь? Насколько я знаю, оно устанавливается для аппаратуры при сканировании, и никак не отражается в выходном файле, только на качестве. Точнее, оно просто теряет смысл. При записи в файл и выводе на экран величина dpi нелепа. Хотя при создании картинки Windows позволяет вручную задавать ее размеры в условных единицах (что, как правило, не делается, ибо эти величины сама Windows никогда не использует). Либо я чего то недопонял? Насчет размеров - как писалось, в формате bmp файла, либо, если ты загружаешь картину скажем в PictureBox, то для этого есть свойства Width и Height класса Picture. К примеру, Picture1.Picture.Height, измеряется в hi-metrics.
Ответить
|
Номер ответа: 10 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #10
|
Добавлено: 22.04.04 18:44
|
To LamerOnLine : Для информации: при записи в файл не отображается информация у тех, кто этого не делает. В начале файла записывается инфа о ширине, высоте рисунка, о том, bmp, jpeg или другой какой формат, размер массива изображения, данные о разрядности цвета, данные о разрешении контекста устройства, с которого получен битмап, на момент его создания и ещё там всякая ересь. Когда загружаешь картинку в ПикчерБокс, то имеешь инфу только о высоте и ширине в пикселях(или твипах). И всё. Это не ширина и не высота рисунка. Это ширина и высота Пикчербокса. И не более того. Что касается оригинала, с которого был получен битмап, то для определения его размеров необходимо знать разрешение устройства, с которого он был получен. Пример: сканируем со сканера рисунок например 10*10 см. Разрешение - 200 dpi. На выходе имеем битмап шириной и высотой (10/2.54)*200 = 787 пикселей. При разрешении 300 dpi тот же рисунок со сканера будет иметь ширину и высоту в пикселях (10/2.54)*300 = 1190 пикселей.(каждая точка со сканера - 1 пиксель). Изображение, которое получаешь со сканера будет иметь на экране размеры, отличные от оригинала. Чем больше разница между разрещением монитора и разрешением сканера, тем дальше картина на экране от истинного размера. Единственный случай совпадения размеров пикчербокса и оригинального рисунка - когда разрешение сканера равно разрешению монитора (т.е. 96 или 72 dpi). Отсюда вся проблема: при выводе на принтер пикчербокса для сохранения оригинального размера необходимо иметь инфу о разрешении, чтобы из выражения (х/2.54)*у восстановить х - размер оригинала. если у неизвестен, то уравнение не имеет однозначного решения. Получить оригинальную копию невозможно. Если делать без учета всего этого, то твой рисунок на принтере будет иметь размер (787*screen.TwipsPerPixelsX)*2.54/1440 = 20.8 см. Т.е. в 2.08 раза больше оригинала. Почему так - потому что разрешение сканера было в 2.08 раза выше разрешения монитора. 200/96=2.08. Соответственно чтобы иметь подлинный размер, необходимо знать разрешение сканера на момент сканирования. Правильный bmp файл должен содержать информацию об этом в структуре Private Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type которая записывается в начале файла. Единственно надо перевести пиксели на метр в пиксели на дюйм. И соответственно поделить полученное разрешение на разрешение монитора для получения коэффициента, на который надо поделить ширину пикчера. Некоторые программы, например ACDSee не пишут этой вещи, поэтому при сканировании и сохранении в файл и последующем открытии файла размер искажается. PhotoShop или Word - записывают, поэтому всегда отображают истинный размер рисунка. А мне нужно было сделать, чтобы копия соответствовала оригиналу. Потому и искал инфу. Всё. Задолбался писать, почти реферат написал. To Sne: Закидываю на ящик. Два примера : bmp и jpeg. Работают. Проверено. Но из того примера, что ты присылал инфы о разрешении не извлечешь. В том который тебе послал разрешение получашь элементарно. И в файл инфа записывается при сохранении. Правда dll 300 схвостом кб, но зато правильно всё
Ответить
|
Номер ответа: 13 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #13
|
Добавлено: 23.04.04 12:47
|
Про PS: естественно AutoSize. Без AutoSize о размерах говорить не приходится. Теперь снова о разрешениии. > Ты, конечно, можешь добавить их в bmp файл или непосредственно с помощью API, но только в том случае, если ты сам создаешь её. Я не создаю её сам, у меня нет доступа к процессу создания картинки. Её создает драйвер. Со сканера не идёт информация о линейных размерах. Только количество точек по высоте, ширине и разрешение. >Если картинку создавала другая программа, но инфу сию не сохранила (а как я говорил, сохраняется она далеко не всегда поскольку GUI ее никгда не использует) - восстановить ты ее не сможешь, как ни крути. Картинку снимает со сканера Wiaaut.dll. Возвращает её в объекте ImageFile. У ImageFile есть св-ва Width, Height, Resolution и т.д. Я могу сам снять эти данные c ImageFile и записать в первых байтах файла bmp. Но зачем, когда у ImageFile есть метод SaveFile, который создает полноценный bmp файл со всеми необходимыми данными, он записывает в файл инфу о размерах (в пикселах) и разрешении и т.д. А разрешение нужно для того, чтобы рассчитать размер исходной картинки из этих трех параметров: Width, Height, Resolution. Даже хватит двух, один из которых Resolution. При создании картинки информации о её истинных размерах в линейных единицах(см, мм, дюйм) нет нигде. Есть лишь данные, из которых можно восстановить этот размер. Width или Height можно восстановить, запихав рисунок в AutoSize PictureBox. Resolution можно только считать из BITMAPINFOHEADER, если, конечно, он туда был записан. Ещё самое главное, на что ты возможно не обратил внимания: 1. Каждая точка на сканере - это 1 пиксель на картинке в Пикчере. 2. Если было 200 dpi, квадрат 1х1 дюйм при переносе на экран будет иметь ширину и высоту 200 пикселей. Если на сканере было 300 dpi, то на экране квадарт 1х1 дюйм будет иметь ширину и высоту 300 пикселей. 3. Один и тот же рисунок на бумаге может иметь разные(в зависимости от разрешения источника) размеры на экране. При последующем выводе с экрана на печать откуда ты будешь знать, какая должна получиться картинка на принтере: 1х1 или 2х2 или ещё какая? Если тебе не важны размеры картинки, лишь бы пропорции сохранялись, можно печатать Fit To Page, а если нужно делать полную копию, один в один, надо знать в какой размер вписывать твой пикчербокс при печати. Без разрешения этого не узнаешь
Ответить
|
Номер ответа: 14 Автор ответа: LamerOnLine
ICQ: 334781088
Вопросов: 108 Ответов: 2822
|
Профиль | | #14
|
Добавлено: 23.04.04 16:46
|
Про PS - еще как приходится. Я же сказал - речь не о размерах PictureBox, а о Picture. Посмотри в хелпе разницу, скажем, между Picture1.Width и Picture1.Picture.Width. Про выходные файлы при сканировании - спасибо за спам, но это знают даже те, кто не знает что такое bmp. Можно было бы не постить лишнее. Ну, а по существу - добавить тут нечего, все уже сказано, вертим на колу мочало PSS. Эта структура находится не в начале в файла, в начале идет структура BITMAPFILEHEADER.
Ответить
|
Номер ответа: 15 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #15
|
Добавлено: 23.04.04 22:01
|
Ну если знаешь, и считаешь информацию о разрешении ненужной, могу тебе на ящик скинуть небольшой рисуночек и посмотрим, как ты определишь размер оригинала, с которого был снят рисунок. Есть желание? Или в кусты?
Ответить
|
Страница: 1 |
Поиск по форуму