Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> качественно cжать bmp 
:(
    Опции темы
GELEAF
Дата 1.5.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.3.2006

Репутация: нет
Всего: нет



Как мне качественно сжать БитМап
PM MAIL ICQ   Вверх
Snowy
Дата 1.5.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



А качество чего меряем?
Если картинки - жми в png.
PM MAIL   Вверх
sergejzr
Дата 1.5.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Самое качественное - zip. BMP им неплохо жмётся.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
GELEAF
Дата 1.5.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.3.2006

Репутация: нет
Всего: нет



Я имел ввиду размер картинки(высота и шырина)-как уменьшить чтоб она получилась гладкой и плавной
PM MAIL ICQ   Вверх
Alexeis
Дата 1.5.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Зависит от типа изображения. Обычно используется бикубическая (кубическая интерполяция по Х и У).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GELEAF
Дата 1.5.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.3.2006

Репутация: нет
Всего: нет



А можно примерчик?http://forum.vingrad.ru/html/emoticons/pack/sample.gif
smile
PM MAIL ICQ   Вверх
Alexeis
Дата 2.5.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Склеив пару примеров из Демок к GDI+ получил следующий код позволяющий сжимать/растягивать изображение 4мя методами слева направо сверху вниз - дефолтный, ближайший сосед, билинейная, бикубическая.

Для работы нужны заголовки GDI+ http://www.progdigy.com/modules.php?name=D...getit&lid=8

Для старших версий делфей возможно прийдется указать прописать следующую константу в дефайны {$DEFINE COMPILER5_UP}

Код

program GDITEST38;

uses
  Classes,
  Windows,
  Messages,
  SysUtils,
  GDIPAPI,
  GDIPOBJ;

type
  TResizeMode = (rmDefault, rmNearest, rmBilinear, rmBicubic);

function ResizeImage(var bmp: TGPBitmap;
               width, Height: integer;
                        mode: TResizeMode): Boolean;
var
  gr: TGPGraphics;
  buf: TGPBitmap;
begin
  buf := TGPBitmap.Create(Width, Height, bmp.GetPixelFormat);

  gr := TGPGraphics.Create(buf);

  case mode of
    rmDefault: ;
    rmNearest:  gr.SetInterpolationMode(InterpolationModeNearestNeighbor);
    rmBilinear: gr.SetInterpolationMode(InterpolationModeHighQualityBilinear);
    rmBicubic:  gr.SetInterpolationMode(InterpolationModeHighQualityBicubic);
  end;

  result := gr.DrawImage(bmp, 0, 0, Width, Height) = Ok;

  gr.Free;
  bmp.Free;

  bmp := buf;
end;

Procedure OnPaint(DC: HDC);
var
  gr : TGPGraphics;
  bmp, tmp: TGPBitmap;
  w0, h0, w, h: integer;
begin
  gr := TGPGraphics.Create(DC);
  bmp := TGPBitmap.Create('..\..\Media\FRUIT.JPG');
  w0 := bmp.GetWidth;
  h0 := bmp.GetHeight;
  w := Round(w0*0.6);
  h := Round(h0*0.6);

  gr.DrawImage(bmp, 5, 5, w0, h0);

  tmp := bmp.Clone(0, 0, w0, h0, bmp.GetPixelFormat);
  if ResizeImage(tmp, w, h, rmDefault) then
    gr.DrawImage(tmp, 5, h0+10, w, h);
  tmp.Free;

  tmp := bmp.Clone(0, 0, w0, h0, bmp.GetPixelFormat);
  if ResizeImage(tmp, w, h, rmNearest) then
    gr.DrawImage(tmp, w+10, h0+10, w, h);
  tmp.Free;

  tmp := bmp.Clone(0, 0, w0, h0, bmp.GetPixelFormat);
  if ResizeImage(tmp, w, h, rmBilinear) then
    gr.DrawImage(tmp, 5, h0+h+15, w, h);
  tmp.Free;

  tmp := bmp.Clone(0, 0, w0, h0, bmp.GetPixelFormat);
  if ResizeImage(tmp, w, h, rmBicubic) then
    gr.DrawImage(tmp, w+10, h0+h+15, w, h);
  tmp.Free;

  gr.Free;
  bmp.Free;
end;


function WndProc(Wnd : HWND; message : UINT; wParam : Integer; lParam: Integer) : Integer; stdcall;
var
  Handle: HDC;
  ps: PAINTSTRUCT;
begin
  case message of
    WM_PAINT:
      begin
        Handle := BeginPaint(Wnd, ps);
        OnPaint(Handle);
        EndPaint(Wnd, ps);
        result := 0;
      end;

    WM_DESTROY:
      begin
        PostQuitMessage(0);
        result := 0;
      end;

   else
      result := DefWindowProc(Wnd, message, wParam, lParam);
   end;
end;

var
  hWnd     : THandle;
  Msg      : TMsg;
  wndClass : TWndClass;
begin
   wndClass.style          := CS_HREDRAW or CS_VREDRAW;
   wndClass.lpfnWndProc    := @WndProc;
   wndClass.cbClsExtra     := 0;
   wndClass.cbWndExtra     := 0;
   wndClass.hInstance      := hInstance;
   wndClass.hIcon          := LoadIcon(0, IDI_APPLICATION);
   wndClass.hCursor        := LoadCursor(0, IDC_ARROW);
   wndClass.hbrBackground  := HBRUSH(GetStockObject(WHITE_BRUSH));
   wndClass.lpszMenuName   := nil;
   wndClass.lpszClassName  := 'GettingStarted';

   RegisterClass(wndClass);

   hWnd := CreateWindow(
      'GettingStarted',       // window class name
      'Creating Thumbnail Images',       // window caption
      WS_OVERLAPPEDWINDOW,    // window style
      Integer(CW_USEDEFAULT), // initial x position
      Integer(CW_USEDEFAULT), // initial y position
      Integer(CW_USEDEFAULT), // initial x size
      Integer(CW_USEDEFAULT), // initial y size
      0,                      // parent window handle
      0,                      // window menu handle
      hInstance,              // program instance handle
      nil);                   // creation parameters

   ShowWindow(hWnd, SW_SHOW);
   UpdateWindow(hWnd);

   while(GetMessage(msg, 0, 0, 0)) do
   begin
      TranslateMessage(msg);
      DispatchMessage(msg);
   end;
end.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.