Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 20:16   #61
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от FoggySpurs Посмотреть сообщение
Когда изображение большое а аперативная память компа маленькая скажем 512 мб...мы не можем сканировать все изо!( Как это сделать посредством seek?
Отчего же не можем?
Хранить - не можем, а сканировать - запросто.
Длина строки у Вас - около 6 Кбайт, это что - непозволительно много?
Из этих 6 Кбайт вырезаем 1/20 часть, т.е. переносим в буфер вновь формируемого изображения около 300 байт.
Теперь нужно пропустить 19 строк. По объему это порядка 120 Кбайт.
На физическое чтение такого объема с диска потребуется около 1 мс. Это существенно меньше периода одного оборота, т.е. при помощи seek мы вряд ли что сможем выгадать, только будем сбивать с толку функции ввода/вывода ОС. Лучше читать все подряд.
Т.е. считываем подряд 20 строк, но только одну из них обрабатываем.
Я бы даже завел на эти цели буфер на длину всех 20 строк, но из считанных 120 К обрабатывал только первые 6. И безо всяких seek.
В новое изображение нам нужно будет перенести порядка 600 строк. Т.е. объем буфера для формируемого изображения порядка 180 Кбайт.
Даже если добавить к этому 120 Кбайт буфера, все равно объем требуемой программе памяти составит около 300 Кбайт. Это что, много?
Цитата:
я не могу перевести задачу с русского языка на язык делфи!
Не боги горшки обжигают.
Тут надо решить: если оно Вам нужно, то надо осваивать, а если нет - то и не браться.
Для меня, кстати, Делфи тоже не является основным рабочим инструментом. Даже на компе, с которого сейчас пишу, Делфи не установлена.
Так что могу подробно рассказать, что и как сделать, и в Паскалевском синтаксисе написать могу, но без специфических для Делфи плюшек.

Кстати, файл, о котором Вы в последний раз написали, имеет объем всего 50 Мбайт, а не 4 Гбайта.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 20:45   #62
FoggySpurs
Пользователь
 
Регистрация: 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 мб только для отладки приложения.
FoggySpurs вне форума Ответить с цитированием
Старый 03.06.2012, 21:21   #63
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код:
var f : file; // будем работать с обычным бинарным файлом
... // все буфера объявляем как array of byte;
assignfile(f, 'filename.bmp'); // здесь подставить нужное нам имя
reset(f,1);
blockread(f, header, 54);
... // здесь анализируем заголовок: проверяем глубину цвета, размеры, смещение...
blockread(f, palette, 60); // читаем палитру - без нее никак
getmem(picture, SizePicture); // здесь считаем точный размер буфера формируемого изображения
getmem(buf, LineLength20); // а здесь - размер 20 строк исходного ~ 120Кбайт
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;

Последний раз редактировалось s-andriano; 03.06.2012 в 21:23.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 21:32   #64
FoggySpurs
Пользователь
 
Регистрация: 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.
FoggySpurs вне форума Ответить с цитированием
Старый 03.06.2012, 21:47   #65
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Это мы открываем файл.
2. Вспомните формат bmp-файла: там два заголовка - 14 и 40 байт
3. "почему 60?" - а откуда у Вас цифр 114 байт?
4. "почему 20?" - потому, что Вы так просили.
5. "что такое сайз У?" - размер того изображения, которое Вы хотите получить. Я же написал "количество строк НОВОГО изображения".
6. "зачем это делать???" - у Вас есть другие идеи, как выбрать из исходного изображения каждый 20-й пиксель?

Я Вам настоятельно рекомендую еще раз внимательно перечитать про формат bmp-файла, т.к. более половины Ваших вопросов относится к нему.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 22:02   #66
FoggySpurs
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 41
По умолчанию

а последняя строка?
FoggySpurs вне форума Ответить с цитированием
Старый 03.06.2012, 22:31   #67
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Собственно, ради этой строки мы и делали все предыдущие манипуляции: этой строкой мы формируем новое изображение.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 23:54   #68
FoggySpurs
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 41
По умолчанию

как то странно формируем
( не узнаю операторы
FoggySpurs вне форума Ответить с цитированием
Старый 04.06.2012, 08:06   #69
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Для того, чтобы понять, что мы делаем, лучше бы еще раз перечитать формат bmp, в частности разрисовать на бумажке, как именно располагаются данные по пикселям в общем массиве данных.
2. Для того, чтобы понять, как мы это делаем, следует изучить операции Паскаля/Делфи.

Кстати, похоже, я немного промахнулся: нам ведь по оси Y надо уменьшить не в 20, а в 14 раз, поэтому считываем не по 20, а по 14 строк за раз.
При этом из пекрвой строки мы выбираем нужные пиксели, а остальные 13 просто игнорируем. Читаем лишь затем, чтобы не прибегать к позиционированию головки, что в данном случае только лишнее.
Далее:
у нас есть строка, в которой надо выбрать каждый 20-й пиксель. Но пиксель занимает полбайта, поэтому нам проще выбирать из 40 пикселей 2, скомпоновать из в один байт и записать в массив результирующего изображения.
Вот мы и идем с шагом в 20 байт (40 пикселей), выбираем из них 2 раза по одному пикселю (полбайта), складываем в один байт и посещаем его в массив.

На вызоде у нас массив данных в точности в формате bmp. Его можно либо загрузить в какую нибудь дельфийскую приблуду по работе с изображением (только нужно сформировать заголовок), дибо сразу отобрадить на форму процедурой StretchDIBits.
s-andriano вне форума Ответить с цитированием
Старый 04.06.2012, 11:19   #70
FoggySpurs
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 41
По умолчанию

на половину операторов комп матерится! Хм...что . Теперь с паскаля на делфи переводить?((( что означиет ^,$f,и откуда взялся buf?
FoggySpurs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открыть файл, разделить ячейку на 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