Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Добавление в Memo или RichEdit   Найти похожие ветки 

 
MegaNop ©   (2006-12-15 00:51) [0]

Вообщем такая ситуация:
В Image загружается картинка. Специальная процедура считывает цвет каждого пикселя и разбивает его на составляющие R G B, которые записываются в многомерный массив.
Необходимо: записать в Memo или RichEdit попиксельную цветовую схему. Объясняю:
    Есть картинка 3х3 пикселя(для примера)
    В Memo должно быть(например):
[1 2 3] [4 5 6] [7 8 9]  -- Число блоков [r g b] по горизонтали = 3
[1 4 6] [2 6 8] [3 4 6]  -- Число блоков [r g b] по вертикали = 3
[2 5 7] [4 7 8] [5 3 6]
Не могу реализовать процедуру этого самого поблочного добавления. Если просто memo.lines.add(string), то он добавляет всё в одну строку, а мне надо: сколько пикселей - столько блоков.
---
У-у-ф, объяснил как мог. Надеюсь поняли.


 
Германн ©   (2006-12-15 01:03) [1]


> Не могу реализовать процедуру этого самого поблочного добавления.
>  Если просто memo.lines.add(string), то он добавляет всё
> в одну строку

Приведи код, который формирует вышеуказанную string.


 
MegaNop ©   (2006-12-15 01:14) [2]

У меня пока так:

Memo1.Lines.Add("["+inttostr(R)+" "+inttostr(G)+" "+inttostr(B)+"]");

Но это только для проверки работоспособности всёй программы, так, естественно, он всё пишет на каждой строке.


 
RASkov   (2006-12-15 01:36) [3]

> [2] MegaNop ©   (15.12.06 01:14)

Сформируй сначала строку а потом ее добавь в мемо
что-нибудь типа так:
str:="";
for n:=0 to Image.Width do begin
R:=...
G:=...
B:=...
str:=str+"["+inttostr(R)+" "+inttostr(G)+" "+inttostr(B)+"];";
end;
Memo1.Lines.Add(str);


 
MegaNop ©   (2006-12-15 01:46) [4]

А как определить, что уже кол-во блоков равно кол-ву пикселей по горизонтали и перейти на новую строку?


 
RASkov   (2006-12-15 01:55) [5]

> [4] MegaNop ©   (15.12.06 01:46)

for h:=0 to Image.Height do begin
str:="";
for w:=0 to Image.Width do begin
 R:=...
 G:=...
 B:=...
 str:=str+"["+inttostr(R)+" "+inttostr(G)+" "+inttostr(B)+"];";
end;
Memo1.Lines.Add(str);
end;


 
RASkov   (2006-12-15 01:57) [6]

R:=GetRValue(Image.Canvas.Pixels[h,w]);
и т.п.


 
RASkov   (2006-12-15 01:58) [7]

Т.е.
R:=GetRValue(Image.Canvas.Pixels[w,h]);
вроде бы...


 
Gydvin ©   (2006-12-15 09:27) [8]

Делать было нечего
Нужно оптимизировать

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TRGB = packed record
   R, G, B: Byte;
 end;
 pRGB = ^TRGB;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   function CnvToTxt(Bitmap: tbitmap; rect: trect): tstringlist;
   procedure view(list: tstrings; var bit: tbitmap; rect: trect);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 bit, de: tbitmap;
 x, y: integer;
 r: trect;
begin
 bit := tbitmap.Create;
 bit.LoadFromFile("C:\YourBitmap.bmp");
 bit.PixelFormat := pf24bit;
 r := rect(0, 0, bit.Width - 1, bit.Height - 1);

 memo1.Lines.Assign(CnvToTxt(bit, r)); ///Поместить битмап в мемо

 de := tbitmap.Create;
 de.Width := bit.Width;
 de.Height := bit.Height;
 de.PixelFormat := pf24bit;

 bit.free;
 caption := (inttostr(memo1.Lines.Count));

 view(memo1.Lines, de, r); //отобразить битмап из мемо (проверка)

 canvas.Draw(0, 0, de);
 de.Free;
end;

function TForm1.CnvToTxt(Bitmap: tbitmap; rect: trect): tstringlist;
 function add(var i: integer; RGB: TRGB; var buffer: array of TRGB; var liststr: tstringlist): boolean;
 begin
   if i < 2 then begin
     buffer[i] := RGB;
     inc(i);
     result := false;
   end else begin
     liststr.Add("[" + inttostr(buffer[0].r) + " " + inttostr(buffer[0].g)
       + " " + inttostr(buffer[0].b) + "]" + "[" + inttostr(buffer[1].r) + " " + inttostr(buffer[1].g)
       + " " + inttostr(buffer[1].b) + "]" + "[" + inttostr(RGB.r) + " " + inttostr(RGB.g)
       + " " + inttostr(RGB.b) + "]");
     result := true;
   end;
 end;

 procedure clear(var i: integer; var RGB: TRGB; var buffer: array of TRGB);
 var
   x: integer;
 begin
   RGB.R := 0;
   RGB.G := 0;
   RGB.B := 0;
   i := 0;
   for x := 0 to 1 do buffer[x] := RGB;
 end;
var
 ind, x, y: integer;
 buff: array[0..1] of TRGB;
 Col: TRGB;
 list: tstringlist;
 Dest: pRGB;
 s: string;
begin
 list := tstringlist.Create;
 clear(ind, Col, buff);

 for y := rect.Top to rect.Bottom do begin
   Dest := Bitmap.ScanLine[y];
   for x := rect.Left to rect.Right do begin
     col := Dest^;
     if add(ind, col, buff, list) then clear(ind, Col, buff);
     inc(Dest);
   end;
 end;
 if ind > 0 then begin
   dec(ind);
   case ind of
     0: list.Add("[" + inttostr(buff[0].r) + " " + inttostr(buff[0].g)
         + " " + inttostr(buff[0].b) + "]");
     1: list.Add("[" + inttostr(buff[0].r) + " " + inttostr(buff[0].g)
         + " " + inttostr(buff[0].b) + "]" + "[" + inttostr(buff[1].r) + " " + inttostr(buff[1].g)
         + " " + inttostr(buff[1].b) + "]");
   end;
 end;
 clear(ind, Col, buff);
 result := tstringlist.Create;
 result.Assign(list);
 list.Free;

end;

procedure TForm1.view(list: tstrings; var bit: tbitmap; rect: trect);
type
 Tdf = record
   a, b, v: string;
 end;
 function razb(s_in: string): tdf;
 var
   s: string;
   i: integer;
 begin
   if s_in <> "" then begin
     i := pos("]", s_in);
     if i > 0 then begin
       result.a := copy(s_in, 2, i - 2);
       delete(s_in, 1, i)
     end;
   end else result.a := "";
   if s_in <> "" then begin
     i := pos("]", s_in);
     if i > 0 then begin
       result.b := copy(s_in, 2, i - 2);
       delete(s_in, 1, i)
     end;
   end else result.b := "";
   if s_in <> "" then begin
     i := pos("]", s_in);
     if i > 0 then begin
       result.v := copy(s_in, 2, i - 2);
       delete(s_in, 1, i)
     end;
   end else result.v := "";
 end;

 function StringToRGB(s: string): trgb;
 var
   i: integer;
 begin
   if s = "" then exit;
   s := s + " ";
   result.R := strtoint(copy(s, 1, pos(" ", s) - 1));
   delete(s, 1, pos(" ", s));
   result.g := strtoint(copy(s, 1, pos(" ", s) - 1));
   delete(s, 1, pos(" ", s));
   result.b := strtoint(copy(s, 1, pos(" ", s) - 1));
   delete(s, 1, pos(" ", s));
 end;

var
 x, y, i, a: integer;
 tr: tstringlist;
 s: TDf;
 Dest: pRGB;
begin
 tr := tstringlist.Create;
 tr.Clear;
 for x := 0 to list.Count - 1 do begin
   s := razb(list.Strings[x]);
   if s.a <> "" then tr.Add(s.a);
   if s.b <> "" then tr.Add(s.b);
   if s.v <> "" then tr.Add(s.v);
 end;
 i := 0;
 a := tr.Count - 1;
 for y := rect.Top to rect.Bottom do begin
   Dest := bit.ScanLine[y];
   for x := rect.Left to rect.Right do begin
     dest^ := StringToRGB(tr.Strings[i]);
     if i < a then inc(i);
     inc(Dest);
   end;
 end;
 tr.Free;
end;

end.



 
Gydvin ©   (2006-12-15 09:30) [9]

И где-то есть ошибка. Искать лениво


 
MegaNop ©   (2006-12-15 13:09) [10]

Ни фига ты код выложил. Во всяком случае - огромное спасибо всем.
Сейчас буду разбираться.


 
MegaNop ©   (2006-12-15 22:00) [11]

-->RASkov

> for h:=0 to Image.Height do begin
> str:="";
> for w:=0 to Image.Width do begin
>  R:=...
>  G:=...
>  B:=...
>  str:=str+"["+inttostr(R)+" "+inttostr(G)+" "+inttostr(B)+"];
> ";
> end;
> Memo1.Lines.Add(str);
> end;


Это действует только при небольшом кол-ве пикселей. А потом memo1 самопроизвольно начинает переносить символы через какое-то определённое их количество.


 
RASkov   (2006-12-15 23:18) [12]

> [11] MegaNop ©   (15.12.06 22:00)

Memo.WordWrap:=False;

> Это действует только при небольшом кол-ве пикселей. А потом
> memo1 самопроизвольно начинает переносить символы через
> какое-то определённое их количество.

Ну сам подумай как тебе это хочеться видеть... ты ж понимаешь, что 1 пиксель это тебе не блок [255 255 255], а тебе нужно в одну строку мемо записать ряд пикселей картинки в "блочном виде", определись... кстати смотрел [8] там вроде бы по три блока выводится, но строк получается более чем рядов в картинке, вроде бы... я не вникал конкретно, просто разок "запустил тот код".


 
RASkov   (2006-12-15 23:24) [13]

> [11] MegaNop ©   (15.12.06 22:00)

В дополнение к [5],[11] и [12]
Memo.WordWrap:=False;

for h:=0 to Image.Height do begin
str:="["+IntToStr(h)+"]: ";
for w:=0 to Image.Width do begin
R:=GetRValue(Image.Canvas.Pixels[w,h]);
G:=GetGValue(Image.Canvas.Pixels[w,h]);
B:=GetBValue(Image.Canvas.Pixels[w,h]);
str:=str+"["+inttostr(R)+" "+inttostr(G)+" "+inttostr(B)+"];";
end;
Memo1.Lines.Add(str);
end;


 
MegaNop ©   (2006-12-15 23:36) [14]

Memo.WordWrap:=False не исправляет ситуацию.
Работает сейчас так:

1 строчка: [1 2 3][4 5 6]...[4 6
2 строчка: 8][5 7 3][4 5 2]...[1 2 5][1
3 строчка:  2 6][5 7 3]...[4 5 6]

А надо соответственно так:
[1 2 3] [4 5 6] [7 8 9]  
[1 4 6] [2 6 8] [3 4 6]
[2 5 7] [4 7 8] [5 3 6]
Чётко и ясно.


 
RASkov   (2006-12-15 23:43) [15]

> Memo.WordWrap:=False не исправляет ситуацию.

Добавь еще и Memo.ScrollBars:=ssHorizontal;

> Чётко и ясно.

Ну здесь нужно определится с составлением строки так как я предложил ровно не будет ибо
[255 10 105]
<>
[3 5 6]
Т.е. формируй строку блоков либо с нулями либо моноширным шрифтом и пробелами...


 
Gydvin ©   (2006-12-16 00:40) [16]


> MegaNop ©   (15.12.06 23:36) [14]

Нсколько я знаю, когда шлишком длинная строка, текстовый редактор переносит строку принудительно! Если для тебя неважен просмотр из твоей проги - юзаq tstringlist

PS. В [8] -  я неправильно понял сабж. Там действительно бъется только по три блока. Остальные переносятся на следующюю строку


 
Gydvin ©   (2006-12-16 00:41) [17]

шлишком = слишком


 
Anatoly Podgoretsky ©   (2006-12-16 12:13) [18]

> Gydvin  (16.12.2006 0:41:17)  [17]

Ааа, а то я думал зубы выбили :-)


 
MegaNop ©   (2006-12-16 18:56) [19]

-> Gydvin


>... - юзаq tstringlist


Что то я не припомню, что это такое. Может пояснишь?


 
Virgo_Style ©   (2006-12-16 19:06) [20]

MegaNop ©   (16.12.06 18:56) [19]
Что то я не припомню, что это такое. Может пояснишь?


есть одно пояснение на уйму случаев жизни: "справка вызывается клавишей F1"


 
MegaNop ©   (2006-12-16 23:32) [21]

Заколебался я с этими Memo. Поэтому взял StringGrid.
Cols=Bitmap height
Rows=Bitmap width
И в каждую ячейку - три составляющие RGB.


 
Gydvin ©   (2006-12-17 00:34) [22]


> Заколебался я с этими Memo. Поэтому взял StringGrid.
> Cols=Bitmap height
> Rows=Bitmap width
> И в каждую ячейку - три составляющие RGB.
>

Бу-га-га



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

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.039 c
1-1163753342
Handle
2006-11-17 11:49
2007.01.07
PopupMenu


9-1141459817
NightLord
2006-03-04 11:10
2007.01.07
PlugInIntf из GLScene


6-1155292138
Orxan
2006-08-11 14:28
2007.01.07
Как проверит существование того или иного почтового ящика,


1-1163399044
Сергей_С
2006-11-13 09:24
2007.01.07
Активировать окно Access


3-1161612134
Winni
2006-10-23 18:02
2007.01.07
Как удалить Co Class ?