|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.06.2012, 20:16 | #61 | ||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Хранить - не можем, а сканировать - запросто. Длина строки у Вас - около 6 Кбайт, это что - непозволительно много? Из этих 6 Кбайт вырезаем 1/20 часть, т.е. переносим в буфер вновь формируемого изображения около 300 байт. Теперь нужно пропустить 19 строк. По объему это порядка 120 Кбайт. На физическое чтение такого объема с диска потребуется около 1 мс. Это существенно меньше периода одного оборота, т.е. при помощи seek мы вряд ли что сможем выгадать, только будем сбивать с толку функции ввода/вывода ОС. Лучше читать все подряд. Т.е. считываем подряд 20 строк, но только одну из них обрабатываем. Я бы даже завел на эти цели буфер на длину всех 20 строк, но из считанных 120 К обрабатывал только первые 6. И безо всяких seek. В новое изображение нам нужно будет перенести порядка 600 строк. Т.е. объем буфера для формируемого изображения порядка 180 Кбайт. Даже если добавить к этому 120 Кбайт буфера, все равно объем требуемой программе памяти составит около 300 Кбайт. Это что, много? Цитата:
Тут надо решить: если оно Вам нужно, то надо осваивать, а если нет - то и не браться. Для меня, кстати, Делфи тоже не является основным рабочим инструментом. Даже на компе, с которого сейчас пишу, Делфи не установлена. Так что могу подробно рассказать, что и как сделать, и в Паскалевском синтаксисе написать могу, но без специфических для Делфи плюшек. Кстати, файл, о котором Вы в последний раз написали, имеет объем всего 50 Мбайт, а не 4 Гбайта. |
||
03.06.2012, 20:45 | #62 |
Пользователь
Регистрация: 14.04.2012
Сообщений: 41
|
можешь написать что то подобное и расписать что ставить вместо x что вместо Y,Z,Q,u,p!?
f.seek(x,y); for j:=z to q do for i:=u to p do begin sl.Read(b,1); sl.Read(g,1); sl.Read(r,1); PaintBox1.Canvas.Pixels[i,J]:=RGB(r,g,b); Программировать на делфи не собираюсь,мне бы эту прогу сдать и зачет получить. И еще одно : Берем ваше предложение- Я бы советовал читать(как читать??) строки целиком и затем выбирать(как выбрать с помошью чего???) из них нужные полубайты. Я не понимаю как приминять глаголы! А файл в 50 мб только для отладки приложения. |
03.06.2012, 21:21 | #63 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Код:
Последний раз редактировалось s-andriano; 03.06.2012 в 21:23. |
03.06.2012, 21:32 | #64 |
Пользователь
Регистрация: 14.04.2012
Сообщений: 41
|
var f : file; // будем работать с обычным бинарным файлом
... // все буфера объявляем как array of byte; assignfile(f, 'filename.bmp'); // здесь подставить нужное нам имя reset(f,1);это что? blockread(f, header, 54);почему 54? ... // здесь анализируем заголовок: проверяем глубину цвета, размеры, смещение... blockread(f, palette, 60); // читаем палитру - без нее никак.--- почему 60? getmem(picture, SizePicture); // здесь считаем точный размер буфера формируемого изображения getmem(buf, LineLength20); // а здесь - размер 20 строк исходного ~ 120Кбайт--почему 20? for j := 0 to SizeY-1 do begin // количество строк НОВОГО изображения, т.е. около 600--что такое сайз У? blockread(f, buf^, LineLength20); // читаем 20 строк за раз for i := 0 to SizeX div 2 -1 // выбираем по 2 пикселя и складываем их в один байт зачем это делать??? picture^[i + j*(SizeX div 2)] := (buf^[i*20] and $f) + ((buf^[i*20+10] and $f) shl 4);--ЭТУ СТРОКУ ВООБЩЕ НЕ понял! end; Последний раз редактировалось FoggySpurs; 03.06.2012 в 21:47. |
03.06.2012, 21:47 | #65 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
1. Это мы открываем файл.
2. Вспомните формат bmp-файла: там два заголовка - 14 и 40 байт 3. "почему 60?" - а откуда у Вас цифр 114 байт? 4. "почему 20?" - потому, что Вы так просили. 5. "что такое сайз У?" - размер того изображения, которое Вы хотите получить. Я же написал "количество строк НОВОГО изображения". 6. "зачем это делать???" - у Вас есть другие идеи, как выбрать из исходного изображения каждый 20-й пиксель? Я Вам настоятельно рекомендую еще раз внимательно перечитать про формат bmp-файла, т.к. более половины Ваших вопросов относится к нему. |
03.06.2012, 22:02 | #66 |
Пользователь
Регистрация: 14.04.2012
Сообщений: 41
|
а последняя строка?
|
03.06.2012, 22:31 | #67 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Собственно, ради этой строки мы и делали все предыдущие манипуляции: этой строкой мы формируем новое изображение.
|
03.06.2012, 23:54 | #68 |
Пользователь
Регистрация: 14.04.2012
Сообщений: 41
|
как то странно формируем
( не узнаю операторы |
04.06.2012, 08:06 | #69 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
1. Для того, чтобы понять, что мы делаем, лучше бы еще раз перечитать формат bmp, в частности разрисовать на бумажке, как именно располагаются данные по пикселям в общем массиве данных.
2. Для того, чтобы понять, как мы это делаем, следует изучить операции Паскаля/Делфи. Кстати, похоже, я немного промахнулся: нам ведь по оси Y надо уменьшить не в 20, а в 14 раз, поэтому считываем не по 20, а по 14 строк за раз. При этом из пекрвой строки мы выбираем нужные пиксели, а остальные 13 просто игнорируем. Читаем лишь затем, чтобы не прибегать к позиционированию головки, что в данном случае только лишнее. Далее: у нас есть строка, в которой надо выбрать каждый 20-й пиксель. Но пиксель занимает полбайта, поэтому нам проще выбирать из 40 пикселей 2, скомпоновать из в один байт и записать в массив результирующего изображения. Вот мы и идем с шагом в 20 байт (40 пикселей), выбираем из них 2 раза по одному пикселю (полбайта), складываем в один байт и посещаем его в массив. На вызоде у нас массив данных в точности в формате bmp. Его можно либо загрузить в какую нибудь дельфийскую приблуду по работе с изображением (только нужно сформировать заголовок), дибо сразу отобрадить на форму процедурой StretchDIBits. |
04.06.2012, 11:19 | #70 |
Пользователь
Регистрация: 14.04.2012
Сообщений: 41
|
на половину операторов комп матерится! Хм...что . Теперь с паскаля на делфи переводить?((( что означиет ^,$f,и откуда взялся buf?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Открыть файл, разделить ячейку на 1000, сохранить файл, закрыть файл. Как? | Ник Харди | Microsoft Office Excel | 7 | 30.01.2012 18:47 |
Не заливается на ФТП большой файл | ramzes777 | Работа с сетью в Delphi | 3 | 26.10.2011 10:19 |
Разбить большой файл на более мелкие | Sat_Kelman | Microsoft Office Excel | 4 | 18.03.2011 13:06 |
отдавать большой файл с фтп | TaTT DoGG | PHP | 5 | 03.07.2009 10:34 |
ActiveX не хочет читать большой файл | Miklek | Общие вопросы Delphi | 0 | 02.04.2009 11:55 |