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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2009, 03:45   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию Уменьшить Bitmap

Здравствуйте ! Есть процедура которая уменьшает в размерах BMP изображение :

Код:
var
  bmp: TBItmap;
begin
  if opendialog1.execute then
  begin
      bmp:= Tbitmap.Create;
      try
        bmp.LoadFromFile(opendialog1.filename);
        bmp.Width := 640;
        bmp.Height:= 480;
        bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, bmp );
        Self.Canvas.Draw(100, 10, bmp );
        bmp.Assign( bmp );
        bmp.SaveToFile(ChangeFileext( opendialog1.filename, '_thumb.BMP' ));
      finally
        bmp.free;
      end;
  end;
end;
Но она его не уменьшает, а как бы обрезает, как сделать, что бы процедура именно уменьшала изображение ? ? ?
RIO вне форума Ответить с цитированием
Старый 05.08.2009, 08:03   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... У меня работает... =)
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.08.2009, 08:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот еще способ
Код:
var
  bmp: TBItmap;
begin
  if opendialog1.execute then
  begin
      bmp:= Tbitmap.Create;
      try
        bmp.LoadFromFile(opendialog1.filename);
        bmp.Width := 640;
        bmp.Height:= 480;
        StretchBlt(bmp.Canvas.Handle,0,0,100,100,bmp.Canvas.Handle,0,0,640,480,SRCCOPY);
        bmp.Width:=100;
        bmp.Height:=100;
        Self.Canvas.Draw(10, 10, bmp );
        bmp.Assign( bmp );
        bmp.SaveToFile(ChangeFileext( opendialog1.filename, '_thumb.BMP' ));
      finally
        bmp.free;
      end;
  end;
end;
Только там в цветности потери. Но смысл остается тот же.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2009, 08:30   #4
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

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

Например, операторы bmp.Width := 640; и bmp.Height:= 480; действительно "образают" изображение в BitMap, если размеры исходного были больше 640х480.
По некоторым догадкам можно сказать, что именно этот размер и нужен автору для результирующего изображения, записываемого в файл.
RIO, чтобы приведенная вами процедура не "обрезала" исходное изображение не нужно уменьшать размеры холста BitMap, а преобразовывать с помощью StretchDraw, ЗАДАВАЯ необходимый вам размер прямоугольника в параметре метода. Этот метод не обрезает, а именно модифицирует изображение.
Код:
var
  bmp: TBItmap;
begin
  if opendialog1.execute then
  begin
      bmp:= Tbitmap.Create;
      try
        bmp.LoadFromFile(opendialog1.filename);
//        bmp.Width := 640;
//        bmp.Height:= 480;
//        bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, bmp );
        bmp.Canvas.StretchDraw(Rect(0, 0, 640, 480), bmp);
        Self.Canvas.Draw(100, 10, bmp);
        bmp.Assign( bmp );
        bmp.SaveToFile(ChangeFileext( opendialog1.filename, '_thumb.BMP' ));
      finally
        bmp.free;
      end;
  end;
end;
При такой организации преобразования изображения в BitMap, как сделано у автора, получается забавный эффект: уменьшенное изображение накладывается на исходное.
Если же нужно спрятать в файл только результирующее изображение, то надо применять две переменные типа TBitMap. В одной хранить исходное изображение, в другой преобразованное и которое записывается в файл.
Код:
var
  bmp, bmp2: TBItmap;
begin
  if opendialog1.execute then begin
    bmp:= Tbitmap.Create;
    try
      bmp.LoadFromFile(opendialog1.filename);
      bmp2 := Tbitmap.Create;
      try
        bmp2.Width := 640;
        bmp2.Height:= 480;
        bmp2.Canvas.StretchDraw(Rect(0, 0, 640, 480), bmp);
        Self.Canvas.Draw(100, 10, bmp2);
        bmp2.SaveToFile(ChangeFileext( opendialog1.filename, '_thumb.BMP' ));
      finally
        bmp2.free;
      end;
    finally
      bmp.free;
    end;
  end;

Последний раз редактировалось Karabash; 05.08.2009 в 08:40. Причина: добавлена "правильная" процедура
Karabash вне форума Ответить с цитированием
Старый 05.08.2009, 14:39   #5
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Спасибо всем Дали исчерпывающую информацию
RIO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
уменьшить размер книги.xls ruavia3 Microsoft Office Excel 16 30.05.2011 12:05
уменьшить на 1 в по поле gred Microsoft Office Access 0 19.06.2009 22:37
Как уменьшить загруженность процессора? Paul Hindenburg Общие вопросы Delphi 13 01.02.2009 08:01
уменьшить размер БД MS Access Кот из Лета БД в Delphi 7 30.12.2007 13:51
Уменьшить высоту картинки Domovoy Общие вопросы Delphi 1 26.12.2007 14:05