Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Тяжёлый вопрос Добавлено: 21.04.04 15:12  

Автор вопроса:  cresta
 Всем здравствуйте. Такое дело: как получить инфу из файла .bmp о высоте, ширине, разрешении(пиксел/дюйм) рисунка. Главным образом интересует расширение.  Кто знает, выручайте, очень надо, плиз...

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #1 Добавлено: 21.04.04 16:28

расширение у bmp-файла это BMP!!!:)

Ответить

Номер ответа: 2
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #2 Добавлено: 21.04.04 16:32

А вот все остальное узнаешь скачав вот это: http://freevbcode.com/source/BitMapInfo.zip

Ответить

Номер ответа: 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 может определить это, а я не могу и меня жаба душит из-за этого. Размеры уже нашел как определить, а с расширением пока туго. За ссылку спасибо, пойду смотреть.

Ответить

Номер ответа: 5
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #5 Добавлено: 21.04.04 17:10

Теперь ещё раз внимательно перечитай свой вопрос и последний ответ. Теперь скажи мне в каком случае ты имел ввиду разрешение, а в каком расширение? Правильно заданный вопрос - половина ответа, ну а если ты путаешься в терминологии, то тогда объясняй на пальцах что тебе надо.

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 21.04.04 18:16

Я думаю что тут имеется ввиду Resolution, то которое при сканировании, да и не только, измеряется в dpi (по-иоему в точках на дюйм), так может к примеру размер файла быть большим, а вот его четкость - низкая, т.е. было взято маловато точичек... А вот как это самое узнать... И ведь это же не только у bmp файлов, но и у остальных...

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 22.04.04 06:14

To User Unknown :  ну естественно разрешение, просто опечатка. Ещё написал что (пиксел/дюйм). Расширение в пикселах не измеряется, не правда ли? Но все равно спасибо за ссылку, правда там ничего нет(ссылка битая), но оттуда по поиску нашел то, что надо на abstractvb.com.

To Sne: если интересно, кину на мыло. Есть для  bmp и jpeg. Правда, jpeg ещё не смотрел. А в bmp можно получить всю инфу. 

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 22.04.04 15:10

Закинь, если не трудно, от примеров я никогда не отказываюсь ;) Да и пригодится, тем более что я собирался написать свою программку для сканирования...

Ответить

Номер ответа: 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 схвостом кб, но зато правильно всё :)

Ответить

Номер ответа: 11
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #11 Добавлено: 23.04.04 01:38
To Sne: кинул тебе на мыло пример, смотри

Ответить

Номер ответа: 12
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #12 Добавлено: 23.04.04 10:24

To cresta: Быть может я опять недопонял, но поясни - зачем все же тебе разрешение сканера? Насколько я понял - тебе нужен лишь размер картинки в миллиметрах. Ты, конечно, можешь добавить их в bmp файл или непосредственно с помощью API, но только в том случае, если ты сам создаешь её. Если картинку создавала другая программа, но инфу сию не сохранила (а как я говорил, сохраняется она далеко не всегда поскольку GUI ее никгда не использует) - восстановить ты ее не сможешь, как ни крути. Это к твоему вопросу.

P.S. Размерность Picture НИКАК не привязана к размеру PictureBox. Исключение - AutoSize.

Ответить

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам