![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день!
Вопросы к программистам, хорошо знающим работу с графикой Исходные данные: - есть test1.bmp (1bit, черный цвет -фон, белый цвет - значащий) - размеры файла 1280х1024 пик (скрин экрана дисплея) - в изображении есть символы и геометрические фигуры Задача: - сгенерировать BMP 1bit файлы 1280х1024 пик из исходного test1.bmp, в количестве равном общему числу символов и фигур в исходном файле - в каждом новом файле должна быть только один символ или фигура, остальным присвоен цвет = черный - фигурой или символом считать совокупность пикселей имеющих между собой контакт - каждый новый файл должен иметь свое имя (координаты первого пикселя символа или фигуры - верхний левый, типа 23-57.bmp) и быть записн на ЖД в том же каталоге Хотелось бы обсудить, с теми кто знает, алгоритмы работы такой программы если есть примеры кода на ДЕЛФИ, хорошо бы взглянуть Заранее спасибо всем! |
|
#2
|
|||
|
|||
|
вот файл БМП
|
|
#3
|
||||
|
||||
|
а если будет фигура в фигуре??
|
|
#4
|
|||
|
|||
|
ну, после определения 1-й фигуры, ее значащие пиксели (белые) приравниваются к черным и при следующем анализе файла эта фигура уже никому не мешает
|
|
#5
|
||||
|
||||
|
Цитата:
Это понятно, но если допустим, у тебя будет треугольник в круге, должно будет создаться 2 файла или же один(круг) |
|
#6
|
|||
|
|||
|
два конечно, вначале круг, затем треугольник
|
|
#7
|
||||
|
||||
|
Прикольная задачка, вот набросал: BmpParser.rar
|
|
#8
|
||||
|
||||
|
AND_REY, а чё ScanLine-ом не пользовался при прохождении по строкам?? получилось бы в раз 500 быстрее
![]() |
|
#9
|
||||
|
||||
|
Чтоб поменьше думать
На рекурсию больше внимание обратил.Можно переписать и сравнить скорость. |
|
#10
|
||||
|
||||
|
Цитата:
Напиши, посмотрим. Я бы сам сделал, но ой как не охотца с битами работать.... ![]() |
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
||||
|
||||
|
Цитата:
Заморочиться можно, но лень Если бы для себя делал, то я тупо конвертнул изображение из 1bit в 8bit а потом сидел бы и улыбался ![]() |
|
#13
|
||||
|
||||
|
Ой наворотил
, но работает.Код:
Var
InBmp, OutBmp: TBitmap;
InP, OutP: Array of PByteArray;
Function GetPixelInP(x, y: Integer): Boolean;
begin
Result:= ((InP[y]^[x Div 8] Shr (7 - (x Mod 8))) And 1) = 1;
end;
Function GetPixelOutP(x, y: Integer): Boolean;
begin
Result:= ((OutP[y]^[x Div 8] Shr (7 - (x Mod 8))) And 1) = 1;
end;
Procedure ChangePixelInP(x, y: Integer);
begin
InP[y]^[x Div 8]:= (Inp[y]^[x Div 8]) Xor (1 Shl (7 - (x Mod 8)));
end;
Procedure ChangePixelOutP(x, y: Integer);
begin
OutP[y]^[x Div 8]:= (OutP[y]^[x Div 8]) Xor (1 Shl (7 - (x Mod 8)));
end;
Procedure RekursBmp(x, y: Integer);
begin
if Not GetPixelInP(x, y) Then Exit;
ChangePixelInP(x, y);
ChangePixelOutP(x, y);
if (x-1) >= 0 Then
if GetPixelInP(x-1, y) Then RekursBmp(x-1, y);
if (y-1) >= 0 Then
if GetPixelInP(x, y-1) Then RekursBmp(x, y-1);
if (x+1) <= InBmp.Width Then
if GetPixelInP(x+1, y) Then RekursBmp(x+1, y);
if (y+1) <= InBmp.Height Then
if GetPixelInP(x, y+1) Then RekursBmp(x, y+1);
if ((x-1) >= 0) And ((y-1) >= 0) Then
if GetPixelInP(x-1, y-1) Then RekursBmp(x-1, y-1);
if ((x+1) <= InBmp.Width) And ((y+1) <= InBmp.Height) Then
if GetPixelInP(x+1, y+1) Then RekursBmp(x+1, y+1);
if ((x-1) >= 0) And ((y+1) <= InBmp.Height) Then
if GetPixelInP(x-1, y+1) Then RekursBmp(x-1, y+1);
if ((x+1) <= InBmp.Width) And ((y-1) >= 0) Then
if GetPixelInP(x+1, y-1) Then RekursBmp(x+1, y-1);
end;
Procedure ClearOutP;
Var
i, j: Integer;
begin
For j:= 0 To OutBmp.Height - 1 Do
For i:= 0 To OutBmp.Height - 1 Do
if GetPixelOutP(i, j) Then ChangePixelOutP(i, j);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, n: Integer;
begin
n:= 1;
InBmp:= TBitmap.Create;
OutBmp:= TBitmap.Create;
InBmp.PixelFormat:= pf1bit;
InBmp.LoadFromFile('1.bmp');
OutBmp.PixelFormat:= pf1bit;
OutBmp.Width:= InBmp.Width;
OutBmp.Height:= InBmp.Height;
OutBmp.Canvas.Brush.Color:= 0;
OutBmp.Canvas.Pen.Color:= 0;
SetLength(InP, InBmp.Height);
SetLength(OutP, OutBmp.Height);
For j:= 0 To InBmp.Height - 1 Do
begin
InP[j]:= InBmp.ScanLine[j];
OutP[j]:= OutBmp.ScanLine[j];
end;
For j:= 0 To InBmp.Height - 1 Do
For i:= 0 To InBmp.Width - 1 Do
if GetPixelInP(i, j) Then
begin
ClearOutP;
RekursBmp(i, j);
OutBmp.SaveToFile('Рис. №'+IntToStr(n)+'.bmp');
Label1.Caption:= 'Штук = '+IntToStr(n);
Application.ProcessMessages;
Inc(n);
end;
OutBmp.Free;
InBmp.Free;
end; |
|
#14
|
|||
|
|||
|
AND_REY, спасибо за помощь
1-й пример кода работает на все 100% 2-й пример кода на реальном файле (скрин экрана 1280х1024) дает справа белое поле с черными символами. но главное есть, в ходе просмотра полученных файлов удалось найти большой косяк - латинская буква k с другими буквами сливается, прийдется в дальнейшем что с этим делать по ходу дискуссии всплыло, что проще было бы использовать BMP 8bit для выделения фигур. исходный файл как раз такой - 8 бит. будет ли обработка 8 бит файла проще и быстрее чем 1бит? |