Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];

Вниз

помогите найти косяк   Найти похожие ветки 

 
Вова   (2013-10-24 00:34) [0]

TSimpleSearchArray = array of word;

Вообщем первая процедура  берет бмп в котором только белые и черные точки, и копируем его в одномерный массив, в котором сохраняем только смещения относительно x=0 для черных точек. А окончание строки помечено числом High(xmin). Также в первом элементе массива сохраняем ширину строки, во втором высоту колонки, попутно обрезая незначащие строки и колонки по краям картинки (т.е. в восстановленной картинке пустых строк и колонок по краям быть не должно)


function ScanLineArray(SearchingBmp: Tbitmap;
 var searchArray: TSimpleSearchArray): boolean;
var
 x, xmin, xmax: word;
 ymin,ymax, y: word;
 i: integer;
 Start, Stop: pInteger;
begin
 result := false;
 if SearchingBmp = nil then
   exit;

 if (SearchingBmp.Height > 0) then
 begin

   Start := SearchingBmp.ScanLine[SearchingBmp.Height - 1];
   Stop := SearchingBmp.ScanLine[0];
   inc(Stop, SearchingBmp.Width);

   // сначала найдем 0.0, т.к. в шаблоне могут быть пустые строки и колонки,
   // то вычисляем минимальные x и y для непустой строки и колонки

   x := 0;
   xmax := 0;
   ymax := 0;
   xmin := High(xmin);
   y := 0;
   ymin := High(ymin);
   repeat
     if Byte(Start^) = 0 then
     begin
       if xmin > x then
         xmin := x;
       if ymin > y then
         ymin := y;
       if xmax < x then
         xmax := x;
       if ymax < y then
         ymax := y;
     end;
     inc(x);
     inc(Start);
     if x > (SearchingBmp.Width - 1) then
     begin
       x := 0;
       inc(y);
     end;
   until Start = Stop;
   if xmax = 0 then
   begin
     SearchingBmp.free;
     exit;
   end;

   Start := SearchingBmp.ScanLine[SearchingBmp.Height - 1];
   // восстанавливаем старт
   // и переводим его в 0.0
   inc(Start, (xmin + ymin * SearchingBmp.Width));
   SetLength(searchArray, 2);
   searchArray[0] := xmax - xmin + 1;  // в первую ячейку мы запишем реальную ширину шаблона
   searchArray[1] := ymax - ymin + 1;  // а во вторую мы запишем реальную высоту шаблона

   // строим шаблон
   x := 0;
   i := 1;
   repeat
     if Byte(Start^) = 0 then
     begin
       inc(i);
       SetLength(searchArray, i + 1);
       searchArray[i] := x;
     end;
     inc(Start);
     inc(x);
     if x > (searchArray[0] - 1) then
     begin
       x := 0;
       inc(i);
       SetLength(searchArray, i+1);
       searchArray[i] := High(searchArray[i]);//пометка о конце строки
     end;
   until Start = Stop;

   result := true;
 end;
 SearchingBmp.free;
end;



А во второй процедуре я пытаюсь получить исходный рисунок из массива полученного в предыдущей процедуре, а получаю какую то фигню.

Procedure Restore(bufX : TSimpleSearchArray);
var
tbmp :TBitmap;
 i: integer;
 Start,p: pInteger;
 x: word;
 y: word;
begin

 tbmp := Tbitmap.Create;
 tbmp.PixelFormat := pf32bit;
 tbmp.Width := bufX[0];
 tbmp.Height:= bufX[1];

 Start := tbmp.ScanLine[tbmp.Height-1];
 p:= Start;
 
 i:=2;
 y:=0;
 x:=0;
 repeat
   if bufX[i] = High(bufX[i]) then //если мы наткнулись на перевод строки, то и переводим ее
   begin
     inc(y);//т.е. добавляем Y
     inc(i);
     continue;
   end;

   inc(p,y*bufX[0] + bufX[i]);
   p^ := 0;
   p  := Start;

   inc(i);
 until y = (bufX[1]-1);

 tbmp.SaveToFile("C:\3.bmp");

end;


Где косяк?


 
Туповатый ©   (2013-10-24 03:40) [1]


> помогите найти косяк

чтобы биться головой? скурить? сделать консервы?


 
Cobalt ©   (2013-10-24 11:51) [2]

Возьми листок бумаги.
Напиши исходные данные
Напиши результат, который должен получиться для них.

Запусти свою программу в отладочном режиме и пошагово проверяй, какие данные записываются в результат.


 
Вова   (2013-10-24 12:18) [3]

таки я уже это все делал, но когда я проверяю на картинке в 4 пикселя все ок. Но когда берем большую картинку, на которой например круг, в итоге получаем кучу каких то полукругов, хотя вроде как больше 2х быть не должно. Я уже 2 дня втыкаю в этот код, ничего не втыкается(


 
Вова   (2013-10-24 12:27) [4]

10
01

Где 1 - черный, т.е. со значением цвета 0.

причем вот в такой картинке
Start := tbmp.ScanLine[tbmp.Height-1];  вроде как должен указывать на нижнюю единицу, но вместо этого там не 0 совсем, а ноль только после inc(Start), т.е. в левом нижнем углу. Похоже я опять что то не могу понять в этих битмапах.


 
Вова   (2013-10-24 12:28) [5]

ой....АААА он указывает на верхний правый ноль ) во....


 
Вова   (2013-10-24 22:44) [6]

оказалось, что в этом коде ошибок нет существенных :-D т.к. если грузить из картинки на диске, то все нормально восстанавливается. а вот если из блоба, то шляпа. Вот так я засовываю и высовываю из  блоба. Что не так то? (

  vBlob := ClientDataSet3.CreateBlobStream
         (Form3.ClientDataSet3.FieldByName("massSample"), bmWrite);
       vBlob.Seek(0, soFromBeginning);
       vBlob.WriteBuffer(searchArray[0], Length(searchArray) * SizeOf(searchArray[0]));
       vBlob.free;


 vBlob := ClientDataSet3.CreateBlobStream
   (ClientDataSet3.FieldByName("massSample"), bmRead);
   TempL := trunc(vBlob.Size/sizeof(word));
   SetLength(bufX,TempL);
 try
   vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
   SizeL := vBlob.Size;
   vBlob.ReadBuffer(bufX[0],SizeL);
 finally
   vBlob.free;
 end;
 if SizeL= 0 then
   exit;


 
Вова   (2013-10-25 02:38) [7]

все....помог себе сам.


 
Inovet ©   (2013-10-25 13:28) [8]

> [3] Вова   (24.10.13 12:18)
> Я уже 2 дня втыкаю в этот код, ничего не втыкается

Так код, значит, скопипастченыей.


 
Вова   (2013-10-25 14:03) [9]

хм, видимо я уже профи, если пишу код похожий на скопипастенный )


 
Туповатый ©   (2013-10-25 14:53) [10]

Ошибаешься. Дважды. Inovet имел ввиду, что раз ты не понимаешь, что написал, значит, это не ты писал. И он прав.


 
Вова   (2013-10-25 15:13) [11]

пруф, что не я писал или платите за моральный ущерб.


 
Вова   (2013-10-25 15:14) [12]

я сказал, что ошибку не могу найти, а не то, что я не понимаю, что написал.


 
Вова   (2013-10-25 15:15) [13]

ну и это, раз вы себя так плохо вели, не скажу вам где тут косяки )


 
Туповатый ©   (2013-10-25 15:19) [14]


> я сказал, что ошибку не могу найти, а не то, что я не понимаю,
>  что написал.

Ну, это как-то не состыковывается. Либо понимаешь и видишь ошибку, либо не видишь ошибку, а значит - не понимаешь, хоть и думаешь наоборот.


> не скажу вам где тут косяки )

да, это правильно. так мне и надо. пойду, брошусь под поезд.


 
Вова   (2013-10-27 12:26) [15]

и вообще, нет ничего глючней и неудобней в этом мире, чем отладчик делфи. переходит по контрол+клик на имени функции черт знает куда зачастую. на точке остановки невозможно узнать значений переменных, т.к. они или вообще недоступны или уже не доступны в следствие драной оптимизации или черт его знает чего еще. Брейк останавливается как правило в паре километров от ошибки, а часто бывает что даже и не показывает где он вообще остановился. короче сидишь в этом отладчике как звездочет и гадаешь, че же где тут и куда.


 
Юрий Зотов ©   (2013-10-27 20:13) [16]

> Вова   (27.10.13 12:26) [15]

http://www.kostyor.ru/poetry/krylov/?n=12


 
Inovet ©   (2013-10-28 06:32) [17]

> [16] Юрий Зотов ©   (27.10.13 20:13)

Или по-современному - пора сменить прокладку.


 
Вова   (2013-10-28 10:43) [18]

не по современному, вы терпилы


 
[ВладОшин] ©   (2013-10-28 10:57) [19]


> нет ничего глючней и неудобней в этом мире, чем отладчик
> делфи

оппа,
так еще никто не говорил.. :)


> вы терпилы

Известных значений у этого слова 2
1. Криминальный. Кто молча сносит наезды
--2. Ментовской (зачеркнуто) Полицейский(зачеркнуто)  (зачеркнуто все) --
1.2.Второй криминальный.  Потерпевший в результате преступления.

Вы какой имели ввиду?


 
Юрий Зотов ©   (2013-10-28 12:39) [20]

> Вова   (28.10.13 10:43) [18]

А что терпеть-то? Терпеть нечего - таких проблем просто не возникает. Похоже, Иван Андреевич все же прав.


 
Вова   (2013-10-28 13:30) [21]

xe2, тратить время на создание видео желания нет, но готов изготовить ролик за ваш счет.


 
Туповатый ©   (2013-10-28 13:51) [22]

чем дебильней, тем самомненительней...


 
Inovet ©   (2013-10-28 13:51) [23]

Может, во время отладки отключать оптимизации надо, прежде чем говорить о глюках? Как отладчик покажет то, чего после оптимизации может и не быть, или оно будет в другом месте.


 
Anatoly Podgoretsky ©   (2013-10-28 13:57) [24]


> xe2, тратить время на создание видео желания нет, но готов
> изготовить ролик за ваш счет.

Теперь стоимость увеличивается вдвое.


 
Юрий Зотов ©   (2013-10-28 15:51) [25]

> Вова   (27.10.13 12:26) [15]

1. Отключите оптимизацию.

2. Включите отладочную информацию и настройте пути к исходникам.

3. Еще на этапе отладки полезно включить контроль переполнения и выхода за диапазон.

4. Перебилдите проект (Build, не Compile).


 
Sapersky   (2013-10-28 16:09) [26]

И отладочный режим FastMM, он в логе пишет, если были выходы за границу блока памяти (header/footer corrupted).


 
Юрий Зотов ©   (2013-10-28 16:11) [27]

> Вова   (27.10.13 12:26) [15]

Да - еще перед билдом убедитесь в том, что исходники и DCU у Вас в единственном экземпляре.


 
[ВладОшин] ©   (2013-10-28 16:22) [28]


> убедитесь в том, что исходники и DCU у Вас в единственном
> экземпляре.


???
не понял..


 
Юрий Зотов ©   (2013-10-28 16:37) [29]

> [ВладОшин] ©   (28.10.13 16:22) [28]

Например, в IDE открыт один MyUnit.pas, а в проект включен другой MyUnit.pas.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.10.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.003 c
15-1393413866
Урсулапов_
2014-02-26 15:24
2014.10.12
Как в гугле искать знак "+"?


3-1301064980
Galera
2011-03-25 17:56
2014.10.12
DisplayFormat - ,0.0;,0.0;??????;


15-1393992591
big_djo
2014-03-05 08:09
2014.10.12
Что Выбрать C# или С++/CLR ?


15-1393619403
Юрий
2014-03-01 00:30
2014.10.12
С днем рождения ! 1 марта 2014 суббота


15-1393587859
alexdn
2014-02-28 15:44
2014.10.12
Как продать программу за рубеж





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский