Форум: "Начинающим";
Текущий архив: 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