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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 01:52   #1
KiLLiR
 
Аватар для KiLLiR
 
Регистрация: 30.03.2008
Сообщений: 9
По умолчанию Печать фрагмента TImage

Всем доброго времени суток.

Суть проблемы в следующем:
на форме находится ScrollBox, на него помещен TImage. Это сделано потому, что TImage масштабируется с помощью TrackBar и когда становится слишком большой и выходит за границы ScrollBox, то линейки прокрутки у ScrollBox позволяют просмотреть все изображение. Но это все предисловие. Сама проблема в том что я хочу напечатать фрагмент TImage, который в данный момент при работе программы находится в поле зрения в ScrollBox. Т.е. пользователь увеличил до нужных размеров, выбрал фрагмент изображения с помощью полос прокрутки и распечатал именно этот фрагмент на весь лист бумаги.
Искал на форуме и нашел тока коды, которые печатают изображение целиком.

Код:
uses  
  Printers;  
procedure TForm1.Button1Click(Sender: TObject);  
var  
  ScaleX, ScaleY: Integer;  
  RR: TRect;  
begin  
  with Printer do  
  begin  
    BeginDoc;  
    // The StartDoc function starts a print job.  
    try  
      ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;  
      ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;  
      // Retrieves information about the Pixels per Inch of the Printer.  
      RR := Rect(0, 0, Image1.picture.Width * scaleX, Image1.Picture.Height * ScaleY);  
      Canvas.StretchDraw(RR, Image1.Picture.Graphic);  
      // Stretch to fit  
    finally  
      EndDoc;    
    end;  
  end;  
end;
Предполагаю что строку
RR := Rect(0, 0, Image1.picture.Width * scaleX, Image1.Picture.Height * ScaleY);
можно заменить строкой
RR := Rect(0, 0, ScrollBox1.Width, ScrollBox1.Height);
но далеко не всегда координаты TImage в левом верхнем углу ScrollBox'а будут 0,0. Как быть с этим я не знаю.

Может есть какие-нибудь другие методы печати, поделитесь секретами кто знает, буду благодарен.
KiLLiR вне форума Ответить с цитированием
Старый 12.04.2009, 11:27   #2
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

А если так:
Код:
 RR := Rect(ScrollBox1.HorzScrollBar.Position, ScrollBox1.VertScrollBar.Position, ScrollBox1.Width, ScrollBox1.Height);
 Printer.Canvas.CopyRect(Printer.Canvas.ClipRect,Image1.Canvas,RR);

Последний раз редактировалось lexaltd; 12.04.2009 в 12:30.
lexaltd вне форума Ответить с цитированием
Старый 12.04.2009, 12:09   #3
Niarb
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 38
По умолчанию

Код:
Canvas.StretchDraw(RR, Image1.Picture.Graphic);
...она просто впишет всю картинку с Image в квадрат RR, а тебе надо наоборот

попробуй вот так: - печатает 1 : 1 выбранную часть рисунка
причем в начальном положении СкролБаров Image должна находится в нулевых координатах (Image1.Left=0; Image1.Top=0)

Код:
procedure TForm1.Button1Click(Sender: TObject);
var rr, rr2: TRect;
    l, t, r, b: integer;
    ScaleX, ScaleY: Integer;
begin
   ScaleX := GetDeviceCaps(Printer.Handle, logPixelsX) div PixelsPerInch;
   ScaleY := GetDeviceCaps(Printer.Handle, logPixelsY) div PixelsPerInch;
   l:=abs(Image1.Left); // l:=ScrollBox1.HorzScrollBar.Position;
   t:=abs(Image1.Top); // t:=ScrollBox1.VertScrollBar.Position;
   r:=l+ScrollBox1.ClientWidth;
   b:=t+ScrollBox1.ClientHeight;
   rr:=Rect(l,t,r,b);
   rr2:=Rect(0,0,(r-l)*ScaleX,(b-t)*ScaleY);
   printer.BeginDoc;
   printer.Canvas.CopyRect(rr2,image1.Picture.Bitmap.Canvas,rr);
   printer.EndDoc;
end;
Чем меньше вы знаете, тем больше я ценен как специалист...
Niarb вне форума Ответить с цитированием
Старый 12.04.2009, 14:34   #4
KiLLiR
 
Аватар для KiLLiR
 
Регистрация: 30.03.2008
Сообщений: 9
По умолчанию

Всем спасибо. Niarb очень помог. Осталось только немного дополнить код т.к. у меня изображение еще масштабируется.
KiLLiR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TImage maxvodo.dll Мультимедиа в Delphi 3 24.10.2008 21:29
TImage в TImage One.Love Общие вопросы Delphi 15 22.09.2008 19:37
TImage Killbrum Помощь студентам 8 27.08.2008 22:40
Чтение фрагмента файла в динамический массив. ZeroCool. Общие вопросы Delphi 2 02.11.2007 08:14
TImage Andrey9392 Компоненты Delphi 6 06.04.2007 10:43