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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2016, 20:12   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Есть ли функции качественного масштабирования tbitmap?

делаю так :
Код:
sk_bmp_cards.Canvas.StretchDraw(Rect(0, 0, 620, 204), sk_bmp_cards);
Но качество оставляет желать лучшего.
Через CSS в html эта же картинка масштабируется гораздо лучше.

П.С. Delphi7

Нашел такое:
Код:
procedure ResizeBMP(ABitMap: TBitmap; ANewWidth, ANewHeight: Integer);
var
 tmpBmp:     TBitmap;
(**)
 divHeight,
 divWidth:   double;
(**)
begin
 tmpBmp := TBitmap.Create;
 try
   tmpBmp.PixelFormat := ABitMap.PixelFormat;
   tmpBmp.Width := ABitMap.Width;
   tmpBmp.Height := ABitMap.Height;
   BitBlt(tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height,
          ABitMap.Canvas.Handle, 0, 0, SRCCOPY);
(**)
   divHeight := ABitMap.Height / ANewHeight;
   divWidth := ABitMap.Width / ANewWidth;
   if (divHeight = 1.0) and (divWidth = 1.0) then
   begin     //  Keine トnderung
     ANewWidth := ABitMap.Width;
     ANewHeight := ABitMap.Height;
   end
   else if divHeight > divWidth then
   begin     //  Bei Height
     ANewWidth := trunc(ABitMap.Width / divHeight);
   end
   else      //  Bei Width
   begin
     ANewHeight := trunc(ABitMap.Height / divWidth);
   end;
(**)
   ABitMap.Width := ANewWidth;
   ABitMap.Height := ANewHeight;
   if SetStretchBltMode(ABitMap.Canvas.Handle, HALFTONE) = 0 then
   begin
     ShowMessage('SetStretchBltMode: ' + SysErrorMessage(GetLastError));
   end
   else if not SetBrushOrgEx(ABitMap.Canvas.Handle, 0, 0, nil) then
   begin
     ShowMessage('SetBrushOrgEx: ' + SysErrorMessage(GetLastError));
   end
   else if not StretchBlt(ABitMap.Canvas.Handle, 0, 0, ABitMap.Width, ABitMap.Height,
                          tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height, SRCCOPY) then
   begin
     ShowMessage('StretchBlt: ' + SysErrorMessage(GetLastError));
   end;
 finally
   tmpBmp.Free;
 end;
end;
Качество не лучше

Последний раз редактировалось Illusiony; 19.04.2016 в 20:21.
Illusiony вне форума Ответить с цитированием
Старый 19.04.2016, 21:27   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Посмотрите на киберфоруме - ребятам удалось:
http://www.cyberforum.ru/delphi-begi...ml#post4086320
kropotkina-alice вне форума Ответить с цитированием
Старый 19.04.2016, 22:56   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Посмотрите на киберфоруме - ребятам удалось:
http://www.cyberforum.ru/delphi-begi...ml#post4086320
Видел это уже, но там на самом деле нету решения. Приведен пример интерполяции только.
Illusiony вне форума Ответить с цитированием
Старый 19.04.2016, 23:30   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Есть ли функции качественного масштабирования tbitmap?
Есть. Но пример могу привести только на С++. Устроит?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.04.2016, 00:01   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Видел это уже, но там на самом деле нету решения.
Пост #37 внимательно посмотрели, под спайдером?

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Приведен пример интерполяции только.
Вы знаете другой способ? Ню-ню...
Тогда флаг вам в руки...
kropotkina-alice вне форума Ответить с цитированием
Старый 20.04.2016, 00:34   #6
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Есть. Но пример могу привести только на С++. Устроит?
К сожалению нет.
Illusiony вне форума Ответить с цитированием
Старый 20.04.2016, 00:36   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Пост #37 внимательно посмотрели, под спайдером?


Вы знаете другой способ? Ню-ню...
Тогда флаг вам в руки...
Да это и имел ввиду, но как им воспользоваться, боюсь сложновато. Несколько фильтров. И как ими масштабировать не знаю.
Illusiony вне форума Ответить с цитированием
Старый 20.04.2016, 00:55   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
К сожалению нет.
Увы, но в Делфях не силён.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.04.2016, 20:01   #9
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Нашел библиотеку FastDIB.

Сделал так:
Код:
procedure TForm1.btn1Click(Sender: TObject);
var Src,Dst:TFastDIB;
jpg_test_nRazpozn:TJPEGImage;
bmp:TBItmap;
begin
Src:=TFastDIB.Create;
Dst:=TFastDIB.Create;
Src.LoadFromFile('jpg_test_nRazpozn0bmp.bmp');
Dst.SetSize(620, 204, Src.Bpp);
Bilinear24(Src, Dst);
//FastResize24(Src, Dst);
//Quick2x24(Src, Dst);
Dst.SaveToFile('jpg_test_nRazpozn__j.bmp');
bmp:=TBitmap.Create;
bmp.LoadFromFile('jpg_test_nRazpozn__j.bmp');
jpg_test_nRazpozn:= TJPEGImage.Create;
 jpg_test_nRazpozn.Assign(bmp);
 jpg_test_nRazpozn.CompressionQuality:=20;
jpg_test_nRazpozn.SaveToFile('jpg_test_nRazpozn__j.jpg');
 Src.Destroy;
 Dst.Destroy;
 bmp.Free;
 jpg_test_nRazpozn.Free;
end;
Все равно качество гораздо хуже чем если бы я без масштабирования сохранил рисунок с тем же качеством jpg=20, а потом отмасштабировал его CSS в html страничке до того же разрешения 620,204

До масштабирования в браузере jpeg загружается с разрешением 1100х362.
Жалко что нельзя сохранить отмасштабированное CSS изображение чтобы можно было сравнить размеры.

Возможно я недопонимаю сам процесс масштабирования в СSS?
Может быть хоть размеры картинки визуально отмасштабированы, но реально картинка осталась весить столько же? таким образом мне нужно сравнивать размеры немасштабированного рисунка в html с масштабированным в delphi, если так сделать, то качество получается близкое.

Кто нибудь использовал эту библиотеку? как в ней загрузить bmp из tbitmap, который создан заранее ,а не из файла?
Вроде есть Assing, но аналогично jpeg в виде: jpg_test_nRazpozn.Assign(sk_bmp_car ds); не работает

Последний раз редактировалось Illusiony; 20.04.2016 в 20:52.
Illusiony вне форума Ответить с цитированием
Старый 20.04.2016, 20:45   #10
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
но как им воспользоваться, боюсь сложновато. Несколько фильтров. И как ими масштабировать не знаю.
Фильтрами не масштабируют, а обрабатывают увеличенное изображение.
Там даже готовый пример дан (пост #39).
Из любопытства сама попробовала и полностью согласна с постом #40.
А вот что вам там "сложновато" - это для меня загадка...
kropotkina-alice вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание качественного GIF файла из видео.С поомощью какой программы? ололошенько Софт 4 28.02.2013 20:55
Есть Tscrollbox и на нем панельки с картинками.. нужно все скопировать в TBitmap vasiles Общие вопросы Delphi 0 10.07.2011 14:05
коэффициент масштабирования zolman Помощь студентам 0 13.04.2011 11:44
Алгоритм масштабирования Alex Cones Свободное общение 4 25.05.2010 16:02