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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 08:21   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

У меня небольшой вопрос: А зачем вы именно в Bitmap грузите? Это не есть гут. Ведь если большой jpg в bmp залить, то он станет действительно большим, а если сразу в Picture, то нет.

Как подогнать под размер Image сразу не скажешь, тут надо с каждым форматом отдельно бороться.
Sibedir вне форума
Старый 26.11.2010, 08:25   #12
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
У меня небольшой вопрос: А зачем вы именно в Bitmap грузите? Это не есть гут. Ведь если большой jpg в bmp залить, то он станет действительно большим, а если сразу в Picture, то нет.
Так как юзаю некий юнит, и в нем есть некие функции по выводу текста, наложению водяного знака, и т д, так вот в нём все организовано для Bitmap
XerSon вне форума
Старый 26.11.2010, 08:25   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я же давал код, только замени последнюю строчку
Код:
вместо
Image.Height:=ClientHeight-Image.Top;
вставь
if Image.Height>ClientHeight-Image.Top then Image.Height:=ClientHeight-Image.Top;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 26.11.2010, 08:46   #14
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Я же давал код, только замени последнюю строчку
Код:
вместо
Image.Height:=ClientHeight-Image.Top;
вставь
if Image.Height>ClientHeight-Image.Top then Image.Height:=ClientHeight-Image.Top;
Я его не проигнорировал, но картинка не правильно маштабируется под клиентскую область Image

Привожу тест проект ниже:
Вложения
Тип файла: rar img_project.rar (3.7 Кб, 18 просмотров)
XerSon вне форума
Старый 26.11.2010, 09:14   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 Аватар
Да не, ТС нужно отмасштабировать именно картинку, а не Image (Чтобы память не жрала).

2 XerSon
Вот, кажись нашел
Код:
    try
      Pic.LoadFromFile (OpenPictureDialog1.FileName);
      BM := TBitmap.Create;
      BM.Assign (Pic.Graphic);
      Pic.Free;

      k := Max (BM.Height/Image1.Height, BM.Width/Image1.Width);
      r1 := Rect (0, 0, BM.Width, BM.Height);
      r2 := Rect (0, 0, Round (BM.Width / k), Round (BM.Height / k));

      with Image1.Picture.Bitmap do begin
        Width := r2.Right;
        Height := r2.Bottom;
        SetStretchBltMode(Canvas.Handle, HALFTONE);
        StretchBlt(Canvas.Handle, 0, 0, Width, Height, BM.Canvas.Handle, 0, 0, BM.Width, BM.Height, SRCCOPY);
      end;
      BM.Free;

Последний раз редактировалось Sibedir; 26.11.2010 в 09:50. Причина: Забыл про BM.Free
Sibedir вне форума
Старый 26.11.2010, 09:25   #16
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

думаю это тебе нужно было?
Код:
      function FitBestSize(Img: Timage): TImageSizeParams;
      var
        h, w, i, x, y: Integer;
        K, b, a: Double;
      begin
        if Img = nil then
          exit;
        try
          Result := ClearImageSizeParams;
          Img.AutoSize := True;
          Img.AutoSize := False;
          GetImageSizeParams(Img, tsBefore);
          h := img.picture.Height;
          w := img.picture.Width;
          i := 0;
          repeat
            x := img.Parent.clientwidth - w;
            y := img.Parent.clientheight - h;
            i := i + 1;
            k := w / h;
            if y < x then
            begin
              b := y;
              h := h + Round(b);
              a := H * k - W;
              w := w + Round(a);
            end;
            if y >= x then
            begin
              a := x;
              w := w + Round(a);
              b := (w / k) - H;
              h := h + Round(b);
            end;
          until (w < img.Parent.width) or (h < img.Parent.height) or (i >= 2);
          img.Stretch := true;
          img.Width := w;
          img.height := h;
          Result := GetImageSizeParams(Img, tsAfter);
        except
        end;
      end;
//
вызвать так
FitBestSize(Form1.Image1);
Помог, нажми весы слева
grafgrial вне форума
Старый 26.11.2010, 09:35   #17
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от grafgrial Посмотреть сообщение
думаю это тебе нужно было?
Код:
TImageSizeParams; // [DCC Error] E2003 Undeclared identifier: 'TImageSizeParams'
ругается компилятор!
XerSon вне форума
Старый 26.11.2010, 09:46   #18
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
ругается компилятор!
http://www.delphisources.ru/pages/fa...age_funcs.html

Вот переделал. Теперь масштабирует правильно в обе стороны
Код:
var
  Pic: TPicture;
  k: Real;
  r1, r2: TRect;
begin
  if OpenPictureDialog.Execute then
  begin
    Pic := TPicture.Create;
    with Image.Picture.Bitmap do
    try
      Pic.LoadFromFile (OpenPictureDialog.FileName);
      Assign (Pic.Graphic);
      Pic.Free;

      k := Max (Height/Image.Height, Width/Image.Width);
      r1 := Rect (0, 0, Width, Height);
      r2 := Rect (0, 0, Round (Width / k), Round (Height / k));

      SetStretchBltMode (Canvas.Handle, HALFTONE);
      if k < 1 then begin
        Width := r2.Right;
        Height := r2.Bottom;
        StretchBlt (Canvas.Handle, 0, 0, r2.Right, r2.Bottom, Canvas.Handle, 0, 0, r1.Right, r1.Bottom, SRCCOPY);
      end
      else begin
        StretchBlt (Canvas.Handle, 0, 0, r2.Right, r2.Bottom, Canvas.Handle, 0, 0, r1.Right, r1.Bottom, SRCCOPY);
        Width := r2.Right;
        Height := r2.Bottom;
      end;
    except
      on E: EInvalidGraphic do
        ShowMessage('Ошибка загрузки');
      on E: EConvertError do
        ShowMessage('Ошибка конвертирования');
    else
      ShowMessage('Прочие ошибки: ' + #13 + Exception(ExceptObject).Message);
    end;
  end;
end;

Последний раз редактировалось Sibedir; 26.11.2010 в 10:07.
Sibedir вне форума
Старый 26.11.2010, 10:06   #19
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Не корректно работает функция, расширяя клиентскую область Image

Код:
var
  Pic: TPicture;
begin
  if OpenPictureDialog.Execute then
  begin
    Pic := TPicture.Create;
    try
      try
        Pic.LoadFromFile(OpenPictureDialog.FileName);
        Image.Picture.Bitmap.Assign(Pic.Graphic);
        FitBestSize(Image);
        //Image.Repaint;
      finally
        Pic.Free;
      end;
    except
      on E: EInvalidGraphic do
        ShowMessage('Ошибка загрузки');
      on E: EConvertError do
        ShowMessage('Ошибка конвертирования');
    else
      ShowMessage('Прочие ошибки: ' + #13 + Exception(ExceptObject).Message);
    end;
  end;
end;
XerSon вне форума
Старый 26.11.2010, 10:09   #20
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

В чем конкретно некорректность?
Sibedir вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить цвет пикселя из картинки jpg,не конвертируя в bmp?? Dima_Dima Общие вопросы Delphi 3 27.05.2010 10:49
как в jpg узнать цвет пикселя без конвертирования в bmp? ????????????????? Dima_Dima Помощь студентам 0 26.05.2010 18:51
Как получить доступ к пикселям jpg без конвертирования в bmp Dima_Dima Общие вопросы Delphi 0 26.05.2010 16:35