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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2011, 11:54   #1
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию Масштабирование через StretchDraw

Всем привет, я уже создавал тему про масштабирование, но никто не ответил, поэтому я масштабирование переделал по другому и снова появился касяк, теперь я масштабирую следующим образом:

Код:
procedure TfrmMain.btnZoomInClick(Sender: TObject);
begin
  if ScaleCoef < 3 then
  begin
    // Увеличение коэффициента масштабирования
    ScaleCoef := ScaleCoef + 0.2;
    // Масштабирование
    ImageScaling;
    // Проверка максимального и минимального значений коэффициента
    if ScaleCoef >= 3 then
      btnZoomIn.Enabled := False;
    if ScaleCoef >= 0.2 then
      btnZoomOut.Enabled := True;
  end;
end;

procedure TfrmMain.ImageScaling;
var
  // Отмасштабированные размеры
  ScaledWidth: Integer;
  ScaledHeight: Integer;
begin
  // Задание размеров буфера и изменение картинки
  // Отмасштабированная длина
  ScaledWidth := Round(OrignWidth * ScaleCoef);
  // Отмасштабированная ширина
  ScaledHeight := Round(OrignHeight * ScaleCoef);
  // Задание размеров буфера
  imgDrawingBuffer.Width := ScaledWidth;
  imgDrawingBuffer.Height := ScaledHeight;
  // Задание размеров основного изображения
  imgOutput.Width := ScaledWidth;
  imgOutput.Height := ScaledHeight;
  // Отрисовка отмасштабированного изображения
  imgOutput.Canvas.StretchDraw(Rect(0, 0, ScaledWidth, ScaledHeight),
    imgDrawingBuffer.Picture.Graphic);
  // Центрирование изображения
  SetImagePosition(imgOutput, ScrollBox.Width, ScrollBox.Height);
end;
Когда я уменьшаю изображение, то все нормально:


А когда увеличиваю сам размер изображения увеличивается, оно масштабируется, но отрисовывается только часть, причем по размерам эта часть равна исходному размеру изображения:
Montysson вне форума Ответить с цитированием
Старый 16.12.2011, 15:31   #2
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию

Похоже форум умер, хер кто откликнется, а зачем, есть же темы попроще "Как рисовать прямоугольник", "Загрузка файла", "Вывод в мемо", а как тема чуть посложнее, то сразу оо да ну нах, даже смотреть такую тему не буду
Montysson вне форума Ответить с цитированием
Старый 16.12.2011, 16:31   #3
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию

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

Что здесь не так?

Код:
procedure TfrmMain.ImageScaling2;
var
  Bitmap1, Bitmap2: TBitmap;
  // Отмасштабированные размеры
  ScaledWidth: Integer;
  ScaledHeight: Integer;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap2 := TBitmap.Create;
  try
    // Отмасштабированная длина
    ScaledWidth := Round(OrignWidth * ScaleCoef);
    // Отмасштабированная ширина
    ScaledHeight := Round(OrignHeight * ScaleCoef);
    Bitmap2.PixelFormat := pf24Bit;
    Bitmap1.SetSize(OrignWidth, OrignHeight);
    Bitmap1.Canvas.Draw(0, 0, imgDrawingBuffer.Picture.Graphic);
    Bitmap2.SetSize(ScaledWidth, ScaledHeight);
    Bitmap2.Canvas.StretchDraw(Rect(0, 0, Bitmap2.Width,
        Bitmap2.Height), Bitmap1);
    imgOutput.Assign(Bitmap2);
    SetImagePosition(imgOutput, ScrollBox.Width, ScrollBox.Height);
  finally
    Bitmap1.Free;
    Bitmap2.Free;
  end;
end;
Вот ошибка: First chance exception at $76A5B9BC. Exception class EConvertError with message 'Cannot assign a TBitmap to a TImage'. Process Coursework.exe (6428)
Montysson вне форума Ответить с цитированием
Старый 16.12.2011, 16:36   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

imgOutput.Picture.Bitmap.Assign(Bitmap2);
Может и imgOutput.Picture.Assign(Bitmap2); прокатит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.12.2011 в 16:39.
Аватар вне форума Ответить с цитированием
Старый 16.12.2011, 16:40   #5
Montysson
Пользователь
 
Аватар для Montysson
 
Регистрация: 16.10.2011
Сообщений: 32
По умолчанию

Аватар, спасибо, ну точно же, ошибка то однозначная, смотрю и не вижу) :D

Только проблема не решилась, когда увеличиваю масштаб изображения сама картинка растягивается, но так же касячно, т.е. рисуется только часть
Montysson вне форума Ответить с цитированием
Старый 16.12.2011, 17:38   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что-то не пойму проблемы. Делайте у Image Stretch и Proportional True, а Autosize False. Меняйте пропорционально исходный размер и получите то что надо.
Цитата:
Похоже форум умер, хер кто откликнется, а зачем, есть же темы попроще "Как рисовать прямоугольник", "Загрузка файла", "Вывод в мемо", а как тема чуть посложнее, то сразу оо да ну нах, даже смотреть такую тему не буду
Это вы зря. Никто никому и ничем на форуме не обязан
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.12.2014, 10:37   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Код:
procedure setrect(var rect: trect; left,top,right,bottom : integer);
begin
  rect.Left:= left;
  rect.Top:= top;
  rect.Right:= right;
  rect.Bottom := bottom;
end;

procedure ResizeRect(var r: TRect; const r2: TRect);
var
vaspect:real;
paspect:real;
newh,neww:integer;
x,y,w,h : integer;
x2,y2,w2,h2 : Integer;
begin
  vaspect := 0;
  paspect := 0;
  x := R.Left;
  y := R.Top;
  w := R.Right-r.Left;
  h := R.Bottom-r.Top;
  if (w<=0) or (h<=0) then Exit;
  x2 := r2.Left;
  y2 := r2.Top;
  neww := r2.Right-r2.Left;
  newh := r2.Bottom-r2.Top;
if (newh<=0) or (neww<=0) then exit;
vaspect:= h / w;
paspect:= newh/neww;
if (vaspect>paspect) then
 begin
// newh:=H;
 neww:=trunc(NewH /vaspect);
 end else if(vaspect<paspect) then
   begin
//   neww:=W;
   newh:=trunc(NewW*vaspect);
   end;{ else          `
     begin
     neww:=W;
     Newh:=H;
     end;}
  SetRect(r,0,0,neww,newh);
end;

procedure CenterRect(var r: TRect; const r2: TRect);
var
  x,y,w,h, x2,y2,w2,h2 : Integer;
begin
  x2 := r2.Left;
  y2 := r2.Top;
  w2 := r2.Right-r2.Left;
  h2 := r2.Bottom-r2.Top;
  x := r.Left;
  y := r.Top;
  w := r.Right-r.Left;
  h := r.Bottom-r.Top;
  x := (w2 div 2)-(w div 2);
  y := (h2 div 2)-(h div 2);
  SetRect(r,x,y,w+x,h+y);
end;

Последний раз редактировалось BLACK_RAIN; 07.12.2014 в 10:40.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Масштабирование SashaAurum C++ Builder 3 07.08.2011 20:52
Масштабирование через StrechDraw AnTe Мультимедиа в Delphi 12 06.02.2009 08:36
Масштабирование Град Microsoft Office Excel 6 24.10.2008 09:23
масштабирование Alex_Pro Общие вопросы .NET 0 21.05.2008 18:21
масштабирование lenivec Общие вопросы Delphi 1 23.02.2008 07:07