![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте,подскажите как сделать чтобы программа присваивала значение пикселя с картинки в ячейку программы?картинка в формате bmp(самый простой вариант на мой взгляд),надо чтоб прога брала 1 пиксель картинки и заносила инфу о цвете в 1 ячейку,потом 2 пиксель во 2 ячейку и так далее.
|
|
#2
|
|||
|
|||
|
По простому - что-то типа:
Код:
var
I, J : Integer;
A : Array Of Array DWORD;
begin
setLength(A,Bitmap.Width,Bitmap.Height);
For I := 0 To ABitmap.Width-1 Do
For J := 0 To ABitmap.Height-1 Do
A[I,J] := Bitmap.Canvas.Pixels[I,J]Но это долго. Поищи пример использования ScanLine. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
player891 (16.03.2012)
| ||
|
#3
|
|||
|
|||
|
Код:
var
Form1: TForm1;
bp:TBitmap;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
bp:=TBitmap.Create;
bp.LoadFromFile('ball.bmp');
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
StringGrid1.ColCount:=bp.Width;
StringGrid1.RowCount:=bp.Height;
for i:=1 to bp.Width do
for j:=1 to bp.Height do
StringGrid1.Cells[j-1,i-1]:=IntToStr(bp.Canvas.Pixels[i,j]);
end; |
|
#4
|
||||
|
||||
|
Норм
, но только медленно. Всё-таки разберись со ScanLine - гораздо быстрее будет.P.S. А если картинка хотя бы 800 на 600 будет? Это что же со StringGrid-ом станется, представить страшно. ![]() |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
player891 (18.03.2012)
| ||
|
#5
|
|||
|
|||
|
Большое всем спасибо за советы,подскажите как бы мне теперь из массива ,в который записывались значения пикселей из бмп файла,записать эти значения в бмп файл?то есть обратная манипуляция,проверка.
|
|
#6
|
||||
|
||||
|
Обратно, оно и есть обратно:
взять пиксел Код:
... StringGrid1.Cells[j-1,i-1]:=IntToStr(bp.Canvas.Pixels[i,j]); вернуть обратно Код:
... bp.Canvas.Pixels[i,j] := StringToColor(StringGrid1.Cells[j-1,i-1], 0); |
|
#7
|
|||
|
|||
|
делаю вот так
Код:
bp:=TBitmap.Create;
bp.LoadFromFile(form1.OpenPictureDialog1.FileName);
StringGrid1.ColCount:=gor;
StringGrid1.RowCount:=vert;
for i:=1 to gor do begin
form1.ProgressBar1.Position:= i div (gor div 100);
for j:=1 to vert do
StringGrid1.Cells[j-1,i-1]:=IntToStr(bp.Canvas.Pixels[i,j]);
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to gor do
for j:=1 to vert do
form1.Canvas.Pixels[i,j]:=strtoint(StringGrid1.Cells[j-1,i-1] );
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
begin
bp1:=TBitmap.Create;
for i:=1 to gor do
for j:=1 to vert do
bp1.Canvas.Pixels[i,j]:=strtoint(StringGrid1.Cells[j-1,i-1] );
bp1.SaveToFile('ball_new.bmp');
end;
баттон 2 работает норм,а вот баттон 3 почему то не сохраняет в файл из гридрида,пишет пустой файл. |
|
#8
|
||||
|
||||
|
Забыл размер создааемого битмапа bp1 указать. В твоём варианте, должно равняться размерам bp.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
player891 (20.03.2012)
| ||
|
#9
|
|||
|
|||
|
переделал,вместо гридрида делал с массивом
Код:
var
Form1: TForm1;
bp,bp1: TBitmap;
pic: array of array of tcolor;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
if (OpenPictureDialog1.Execute) and FileExists(OpenPictureDialog1.FileName)
then begin
form1.Image1.Picture.LoadFromFile(form1.OpenPictureDialog1.FileName);
bp:=TBitmap.Create;
bp.LoadFromFile(form1.OpenPictureDialog1.FileName);
end;
SetLength(pic,bp.Width,bp.Height);
for i:=1 to bp.Width do
for j:=1 to bp.Height do
pic[i-1,j-1]:=bp.Canvas.Pixels[i,j];
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to bp.Width do
for j:=1 to bp.Height do
form1.Canvas.Pixels[i,j]:=pic[i-1,j-1] ;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
begin
bp1:=TBitmap.Create;
bp1.Width:=bp.Width;
bp1.Height:=bp.Height;
for i:=1 to bp.Width do
for j:=1 to bp.Height do
bp1.Canvas.Pixels[i,j]:=pic[i-1,j-1];
bp1.SaveToFile('ball_new.bmp');
end;
end.bp1.Width:=bp.Width; bp1.Height:=bp.Height; Последний раз редактировалось player891, 20.03.2012 в 21:58. |
|
#10
|
||||
|
||||
|
Прекрасно всё работает:
Код:
unit Unit28;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenPictureDialog1: TOpenPictureDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
bp, bp1 : TBitmap;
pic: array of array of TColor;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I, J : Integer;
begin
if (OpenPictureDialog1.Execute) and FileExists(OpenPictureDialog1.FileName) then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
bp := TBitmap.Create;
bp.LoadFromFile(OpenPictureDialog1.FileName);
end;
SetLength(pic, bp.Width, bp.Height);
for I := 0 to bp.Width - 1 do
for J := 0 to bp.Height - 1 do
pic[I, J] := bp.Canvas.Pixels[I, J];
end;
procedure TForm1.Button2Click(Sender: TObject);
var
I, J : Integer;
begin
for I := 0 to bp.Width - 1 do
for J := 0 to bp.Height - 1 do
Form1.Canvas.Pixels[I, J] := pic[I, J];
end;
procedure TForm1.Button3Click(Sender: TObject);
var
I, J : Integer;
begin
bp1 := TBitmap.Create;
bp1.Width := bp.Width;
bp1.Height := bp.Height;
for I := 0 to bp1.Width - 1 do
for J := 0 to bp1.Height - 1 do
bp1.Canvas.Pixels[I, J] := pic[I, J];
bp1.SaveToFile('ball_new.bmp');
end;
end. |
|
#11
|
|||
|
|||
|
не могу понять что не так,файл бмпшный создает но не сохраняет ничего туда,размер 0 байт
|
|
#12
|
||||
|
||||
|
Посмотри мой код внимательно и найди отличия от твоего или просто скопируй нужные места, всё будет прекрасно сохранять.
|
|
#13
|
|||
|
|||
|
все!!!ура!!!свершилось)короче проблема была в следующем:я в тоталкомандере файлик открывал и смотрел он почему то не отображался,случайно зашел просто через проводник смотрю-ball_new.bmp 70kb,открыл - увидел изображение,не знаю по какой причине тотал не показывает.
|