Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 23:19   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Масштабирование и память

Нужно сделать масштабирование до больших масштабов (до 1:32). Если просто увеличивать битмап, то очень много памяти жрет. Как это лучше реализовать? Смотрел в других программах, тот же Пэинт, и т.д., у них такого нет, т.е. использование памяти не увеличивается.
Прокрутка у меня с помощью скроллбокса сделана. Изображение на PaintBox вывожу.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 05.09.2010, 03:13   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Как вы выводите-то увеличенную область? Через StretchBlt()?

Хм... А что значить "просто увеличивать битмап"?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.09.2010, 23:38   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Как вы выводите-то увеличенную область? Через StretchBlt()?
Примерно так и вывожу.
Цитата:
Хм... А что значить "просто увеличивать битмап"?
Увеличивать - значит увеличивать, был 100х100, стал 1000х1000. Скроллбокс в этом случае автоматически прокручивает, но память сильно расходуется. Я вот подумал, если самому координаты определять, и "стречблиттить" (StretchBlt) нужный кусок, обрабатывая ползунки скроллбокса, расход памяти заметно уменьшится, но не будет ли тормозов? Не попробовав не узнаешь, на днях попробую реализовать такую штуку.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.09.2010, 00:00   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Пробуй увеличивать через TCanvas.CopyRect
Там можно маленький участок на большой растянуть. Ну т.е. если просто сделать будет рядом миниатюра изображения, например оригинального размера с курсором области увеличения, а рядом увеличенное изображение.
Altera вне форума Ответить с цитированием
Старый 06.09.2010, 03:52   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Цитата:
самому координаты определять, и "стречблиттить" (StretchBlt) нужный кусок, обрабатывая ползунки скроллбокса
Вроде всегда так и делают...


Как-то так попробуйте (пример для фиксированного размера 256x256):

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ScrollBar2Change(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var Form1: TForm1; zoom, posX, posY: Integer; pict: TBitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var x, y: Integer; pt: ^tagRGBTRIPLE;
begin
Form1.ClientWidth:=290;
form1.ClientHeight:=330;
DoubleBuffered:=True;
ScrollBar1.Min:=0;
ScrollBar1.Width:=256;
ScrollBar1.Height:=17;
ScrollBar1.Left:=0;
ScrollBar1.Top:=256;
ScrollBar2.Kind:=sbVertical;
ScrollBar2.Min:=0;
ScrollBar2.Width:=17;
ScrollBar2.Height:=256;
ScrollBar2.Left:=256;
ScrollBar2.Top:=0;
TrackBar1.Min:=1;
TrackBar1.Max:=32;
TrackBar1.Width:=256;
TrackBar1.Height:=28;
TrackBar1.Left:=0;
TrackBar1.Top:=290;
TrackBar1.Position:=1;
zoom:=1;
posX:=0;
posY:=0;
pict:=TBitmap.Create;
pict.PixelFormat:=pf24bit;
pict.Width:=256;
pict.Height:=256;
for y:=0 to 255 do
      begin
      pt:=pict.ScanLine[y];
      for x:=0 to 255 do
            begin
            pt.rgbtRed:=x+y;
            pt.rgbtGreen:=y*y+x*x;
            pt.rgbtBlue:=x*y;
            inc(pt);
            end;
      end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
StretchBlt(Form1.Canvas.Handle, 0, 0, 256, 256, pict.Canvas.Handle, posX, posY, 256 div zoom, 256 div zoom, SRCCOPY);
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
posX:=ScrollBar1.Position;
Repaint;
end;

procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
posY:=ScrollBar2.Position;
Repaint;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
zoom:=TrackBar1.Position;
ScrollBar1.Max:=256-(256 div zoom);
ScrollBar2.Max:=256-(256 div zoom);
Repaint;
end;

end.
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 06.09.2010, 07:45   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Нужно сделать масштабирование до больших масштабов (до 1:32). Если просто увеличивать битмап, то очень много памяти жрет. Как это лучше реализовать? Смотрел в других программах, тот же Пэинт, и т.д., у них такого нет, т.е. использование памяти не увеличивается.
Прокрутка у меня с помощью скроллбокса сделана. Изображение на PaintBox вывожу.
Откройте photoshop и в нем большое изображение, и начинайте менять размеры окна и скролить увидите как части (квадраты) изображения начнут двигаться. Вот вам и решение. т.е. отрисовывать только видимые части
BOBAH13 вне форума Ответить с цитированием
Старый 06.09.2010, 16:58   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Спасибо за примеры, буду пробовать.

BOBAH13, да, есть такое )
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Масштабирование графиков в VB Kracozebr Помощь студентам 0 03.08.2010 09:26
Масштабирование Град Microsoft Office Excel 6 24.10.2008 09:23
масштабирование изображения Alex_Pro Общие вопросы .NET 0 25.05.2008 09:09
масштабирование Alex_Pro Общие вопросы .NET 0 21.05.2008 18:21
масштабирование lenivec Общие вопросы Delphi 1 23.02.2008 07:07