Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вывод части Bitmap


Страницы:   1 2 3

valussev@mail.ru ©   (2009-12-24 19:06:00) 

всем привет, возникла такая необходимость:

есть картинка в битмапе
область где должна быть выведена картинка разбита допустим на 16 равных квадратов
как сделать так, чтобы при нажатии на 1 из этих квадратов открывалась часть картинки из битмапа?

пробовал делать через массивы


pole: array[1..H, 1..W] of byte;
   ex,ey: integer; // координаты пустой клетки

   // правильное расположение клеток
   stp : array[1..H, 1..W] of byte =
   (( 1, 2, 3, 4),
    ( 5, 6, 7, 8),
    ( 9,10,11,12),
    (13,14,15, 0));

for i:=1 to H do
for j:=1 to W do
pole[i,j] := stp[i,j];

но что то не получается
заранее спасибо


MonoLife   (2009-12-25 05:33:00) [1]


> {RASkov} ©   (25.12.09 00:48) [29]

+1 Я тоже люблю StringGrid:)


Германн   (2009-12-25 03:00:00) [2]


> Игорь Шевченко ©   (25.12.09 02:36) [45]

Мне бы твои проблемы :)


Игорь Шевченко   (2009-12-25 02:36:00) [3]

Германн ©   (25.12.09 02:30) [44]

Гондурас, разумеется


Германн   (2009-12-25 02:30:00) [4]


> Игорь Шевченко ©   (25.12.09 02:26) [43]
>
> Раз все такие ленивые, сделал я:
>

И что у тебя "чесалось" :)


Игорь Шевченко   (2009-12-25 02:26:00) [5]

Раз все такие ленивые, сделал я:

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;

type
 TForm1 = class(TForm)
   Grid: TDrawGrid;
   procedure FormCreate(Sender: TObject);
   procedure GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
     State: TGridDrawState);
   procedure GridSelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
   procedure FormResize(Sender: TObject);
 private
   FOriginalImage: TBitmap;
   FWorkerImage: TBitmap;
   //Это сделано намерено тупо
   FOpened: array[0..10, 0..10] of Boolean;
   procedure ResizeGrid;
 end;

var
 Form1: TForm1;

implementation

type TGridCracker = class(TCustomGrid) end;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FOriginalImage := TBitmap.Create;
 FOriginalImage.LoadFromFile('.\core17.bmp');
 ResizeGrid;
end;

function NumToPixels(Grid: TDrawGrid; Col, Row: Integer): TRect;
begin
 Result.Left := Grid.DefaultColWidth * Col;
 Result.Right := Result.Left + Grid.DefaultColWidth;
 Result.Top := Grid.DefaultRowHeight * Row;
 Result.Bottom := Result.Top + Grid.DefaultRowHeight;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 FWorkerImage.Free;
 ResizeGrid;
end;

procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
 State: TGridDrawState);
begin
 if FOpened[ACol, ARow] then
   Grid.Canvas.CopyRect(Rect, FWorkerImage.Canvas, NumToPixels(Grid, ACol, ARow))
 else
 begin
   Grid.Canvas.Brush.Color := clBlack;
   Grid.Canvas.FillRect(Rect);
 end;
end;

procedure TForm1.GridSelectCell(Sender: TObject; ACol, ARow: Integer;
 var CanSelect: Boolean);
begin
 FOpened[ACol, ARow] := not FOpened[ACol, ARow];
 TGridCracker(Grid).InvalidateCell(ACol, ARow);
end;

procedure TForm1.ResizeGrid;
begin
 FWorkerImage := TBitmap.Create;
 FWorkerImage.Width := Grid.ClientWidth;
 FWorkerImage.Height := Grid.ClientHeight;
 FWorkerImage.Canvas.StretchDraw(
   Rect(0, 0, FWorkerImage.Width, FWorkerImage.Height),
   FOriginalImage);
 Grid.DefaultRowHeight := Grid.ClientHeight div Grid.RowCount;
 Grid.DefaultColWidth := Grid.ClientWidth div Grid.ColCount;
end;

end.


Что не понравилось - не нашел метода перерисовки отдельной ячейки у DrawGrid.

Что понравилось - возможность изменения размера под размер формы, без особенных ухищрений.

То есть, по сути, тот же PaintBox, только с отдельным окном.


Amoeba   (2009-12-25 01:55:00) [6]


> Не занят   (25.12.09 01:47) [40]
>
>
> > Amoeba ©   (25.12.09 01:43) [39]
>
>
> Я же написал можно, а не нужно. Понятно, что от деталей
> зависит...

Не вижу предмета для спора. Полностью согласен.


Amoeba   (2009-12-25 01:51:00) [7]


> Игорь Шевченко ©   (25.12.09 01:36) [37]
> Пример хотелось бы увидеть. Работающий.

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


Не занят   (2009-12-25 01:47:00) [8]


> Amoeba ©   (25.12.09 01:43) [39]


Я же написал можно, а не нужно. Понятно, что от деталей зависит...


Amoeba   (2009-12-25 01:43:00) [9]


> Не занят   (25.12.09 01:36) [36]
>
> Картинку можно заранее порезать на квадратики, и поместить
> их в ImageList. Тогда ещё будет.
> ImageIndex = Row * RowCount + Col

А если картинка не одна единственная, а их несколько (даже одного размера)? Будем каждую заранее резать и запихивать в ImageList?


Не занят   (2009-12-25 01:41:00) [10]

А что этот пример даст? Понятно, что можно и так и так написать, и в этом простом случае сложность примеров не особо будет отличаться. Здесь вопрос глубже, идеологический. RAD или не RAD?


Не занят   (2009-12-25 01:36:00) [11]

Картинку можно заранее порезать на квадратики, и поместить их в ImageList. Тогда ещё будет.
ImageIndex = Row * RowCount + Col


Игорь Шевченко   (2009-12-25 01:36:00) [12]

Amoeba ©   (25.12.09 01:26) [34]


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


Если честно - не вижу разницы. Под разбиванием я имел в виду не размещение по нескольким битмапам, а определение координат той части, которая должна быть нарисована.

Пример хотелось бы увидеть. Работающий.


Германн   (2009-12-25 01:32:00) [13]

Откуда такой спор на пустом месте?
Дельфи - это RAD-инструмент или как? Если RAD, то для ответа на частный вопросвполне подходит способ с применением стандартного контрола (TDrawGrid), даже если количество "ячеек" заранее известно.
Делали (шахматы), знаем :)
А вот если бы в саже была озвучена конкретная задача, тогда бы был смысл в споре "что и как применять".


Amoeba   (2009-12-25 01:26:00) [14]


> Игорь Шевченко ©   (25.12.09 00:24) [23]
>
> Я наверное чего-то не понимаю, для отображения в DrawGrid
> исходную картинку нужно будет разбивать на части, не правда
> ли ?
> А если есть картинка, разбитая на части, почему бы не выводить
> ее сразу в битмап ?

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


Не занят   (2009-12-25 01:00:00) [15]


> Игорь Шевченко ©   (25.12.09 00:36) [27]
> Не занят   (25.12.09 00:32) [25]
>
> Пример в студию
>
>


Делфи, к сожалению, у меня нет на компьютере, вот что то набросал от руки. Это псевдокод, за точность названий методов и порядков параметров в них не ручаюсь.

В CellClick

 Opened[Col, Row] := True;
 Grid.InvalidateCell(Col, Row);

В DrawCell

if Opened[Col, Row] then
  Grid.Canvas.CopyRect(Source, CellRect, NumToPixels(Row, Col))
else
  Grid.Canvas.FillRect(...)

function NumToPixels(Col, Row): TRect;
var
  cellSize: Extended;
begin
  cellSize := Source.Width / Grid.ColCount;
  Result.Left := cellSize * Col;
  Result.Width := Result.Left + cellSize;;

  cellSize := Source.Height / Grid.ColCount;
  Result.Top := cellSize * Col;
  Result.Bottom := Result.Top + cellSize;;
end;


{RASkov}   (2009-12-25 00:56:00) [16]

> [30] antonn ©   (25.12.09 00:52)
> А главное в DrawGrid нету Cells[]

это не страшно


{RASkov}   (2009-12-25 00:53:00) [17]

не, я не призываю пользовать грид..... просто как альтернатива :)
и нужно понимать, что в [29] - это не готовый результат или даже не пример вообще, а просто намек... :о)


antonn   (2009-12-25 00:52:00) [18]

большая пушка, 150мм.
А главное в DrawGrid нету Cells[]


{RASkov}   (2009-12-25 00:48:00) [19]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Grids;

type
 TForm1 = class(TForm)
   Button1: TButton;
   StringGrid1: TStringGrid;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
   procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
 private
   BMP: TBitMap;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 BMP:=TBitmap.Create;
 StringGrid1.FixedCols:=0;
 StringGrid1.FixedRows:=0;
 StringGrid1.GridLineWidth:=0;
 StringGrid1.DefaultRowHeight:=StringGrid1.DefaultColWidth;
 StringGrid1.Width:=(StringGrid1.DefaultColWidth*StringGrid1.ColCount)+StringGrid1.ColCount;
 StringGrid1.Height:=(StringGrid1.DefaultRowHeight*StringGrid1.RowCount)+StringGrid1.RowCount;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TOpenDialog.Create(nil) do try
  Filter:='Bmp Files|*.bmp';
  if Execute then begin
   BMP.LoadFromFile(FileName);
   StringGrid1.Invalidate;
  end;
 finally
  Free;
 end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 with Sender as TStringGrid do begin
  if StringGrid1.Cells[ACol, ARow]='1' then Canvas.CopyRect(Rect, BMP.Canvas, Rect)
   else begin
    Canvas.Brush.Color:=clBlue;
    Canvas.FillRect(Rect);
   end;
 end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
 ARow: Integer; var CanSelect: Boolean);
begin
 if StringGrid1.Cells[ACol, ARow]='1' then StringGrid1.Cells[ACol, ARow]:=''
  else StringGrid1.Cells[ACol, ARow]:='1';
end;

end.


Игорь Шевченко   (2009-12-25 00:38:00) [20]

В DrawGrid наверное хорошо показывать много картинок, заранее неизвестного количества.
Типа thumbnails каких-нибудь.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо