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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2010, 20:29   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
а сейчас глянул пример, который с ней идёт (прекрасный, на делфях) - похоже, придётся иного изучать, и думать
Если нужно просто показывать картинки то не думаю что это сложно. Может в ней есть и другие функции, такие как поворот (Rotate) или обрезка (Crop), тогда многие вопросы снимаются.

Цитата:
Вот только с поворотом и обрезкой, "без потери качества"
Поворот растра без потери качества не бывает, можно сделать почти без потери качества, применив наилучший для этого алгоритм. Совсем без потерь он только при углах поворота 90, 180, 270.
А вот обрезка (без масштабирования) без потерь бывает. Самый простой способ (а моежт и единственный) это распаковать JPEG в несжатый растр, сделать обрезку и запаковать обратно имеющимся кодером. Если использовать тот же кодер или лучший, чем к-рым изначально паковали, и с теми же настройками, то кач-во не потеряется. Непосредственно JPEG в том виде как он есть обрезать нельзя, т.к. он сжатый, по любому надо перепаковывать.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.07.2010, 14:47   #12
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Если нужно просто показывать картинки то не думаю что это сложно.
ннууу....

входные данные - FlushCache, из меню, и Size, один из вариантов: 1:1, 1:2, 1:4, 1:8

рисует на Image.Picture.Bitmap
Код:
procedure TForm1.LoadJPG(FileName : string);
const
  sRead : array [Boolean] of String = ('JFILE_READ = ','JBUFF_READ = ');
var
  iWidth, iHeight, iNChannels : Integer;
  iStatus : Integer;
  pBuf : PByte;
  iIndex : Integer;
  bInCache : Boolean;
  R : TRect;
  sFunc : string;
begin
  try
    sFunc := 'Load JPEG';
    Screen.Cursor := crHourGlass;
    sFileName := FileName;
    sFunc := 'ijlInit()';
    iStatus := ijlInit(@jcprops);
    if iStatus < 0 then
      raise Exception.Create('Own: Error in IJL function.');
    sFunc := 'Load JPEG';
    Caption := sMainCaption + ' ('+FileName+')';
    bInCache := False;
    iIndex := 0;
    if CacheList.Count > 0 then
      bInCache := CacheList.Find(AnsiUpperCase(FileName),iIndex);
    if bInCache then
    begin
      jcprops.JPGBytes := PByte(CacheList.Objects[iIndex]);
      jcprops.JPGSizeBytes := 750000;
      sFunc := 'ijlRead(JBUFF_READPARAMS)';
      iStatus := ijlRead(@jcprops,IJL_JBUFF_READPARAMS);
    end
    else
    begin
      jcprops.JPGFile := PChar(FileName);
      sFunc := 'ijlRead(JFILE_READPARAMS)';
      iStatus := ijlRead(@jcprops,IJL_JFILE_READPARAMS);
    end;
    if iStatus < 0 then
      raise Exception.Create('Own: Error in IJL function.');
    sFunc := 'Load JPEG';
    iWidth := (jcprops.JPGWidth+iAdd) div iDiv;
    iHeight := (jcprops.JPGHeight+iAdd) div iDiv;
    //iNChannels := 3;
    iNChannels := jcprops.JPGChannels;
    with Image.Picture.Bitmap do
    begin
      Width := iWidth;
      Height := iHeight;
      if iNChannels = 4 then
        PixelFormat := pf32bit
      else
        PixelFormat := pf24bit;
    end;
    ClientWidth := iWidth;
    ClientHeight := iHeight+StatusBar.Height+ToolBar.Height;
    FillChar(DIB,SizeOf(DIB),0);
    GetObject(Image.Picture.Bitmap.Handle,SizeOf(DIB),@DIB);
    jcprops.DIBWidth := iWidth;
    jcprops.DIBHeight := -iHeight;
    jcprops.DIBChannels := iNChannels;
    if iNChannels = 4 then
      jcprops.DIBColor := IJL_RGBA_FPX
    else
      jcprops.DIBColor := IJL_BGR;
    jcprops.DIBPadBytes := ((((iWidth*iNChannels)+3) div 4)*4)-(iWidth*iNChannels);
    jcprops.DIBBytes := PByte(DIB.dsBm.bmBits);
    if (jcprops.JPGChannels = 3) then
      jcprops.JPGColor := IJL_YCBCR
    else if (jcprops.JPGChannels = 4) then
      jcprops.JPGColor := IJL_YCBCRA_FPX
    else if (jcprops.JPGChannels = 1) then
      jcprops.JPGColor := IJL_G
    else
    begin
      // This catches everything else, but no
      // color twist will be performed by the IJL.
      jcprops.DIBColor := TIJL_COLOR (IJL_OTHER);
      jcprops.JPGColor := TIJL_COLOR (IJL_OTHER);
    end;
    if bInCache then
    begin
      sFunc := 'ijlRead(JBUFF_xxx)';
      iStatus := ijlRead(@jcprops,Succ(iReadCommand));
    end
    else
    begin
      sFunc := 'ijlRead(JFILE_xxx)';
      iStatus := ijlRead(@jcprops,iReadCommand);
    end;
    if iStatus < 0 then
      raise Exception.Create('Own: Error in IJL function.');
    sFunc := 'Load JPEG';
    if jcprops.DIBColor = IJL_RGBA_FPX then
      RGBA2BGRA(jcprops.DIBBytes,iWidth,iHeight);
    R := ClientRect;
    //InvalidateRect(ClientHandle,Addr(R),False);
    Image.Repaint;
    //StatusBar.Repaint;
    //Update;
    if (not bInCache) and (jcprops.DIBColor <> IJL_RGBA_FPX) then
    begin
      pBuf := AllocMem(iWidth*iHeight*iNChannels);
      jcprops.JPGFile := nil;
      jcprops.JPGBytes := pBuf;
      jcprops.JPGSizeBytes := iWidth*iHeight*iNChannels;
      jcprops.JPGWidth := iWidth;
      jcprops.JPGHeight := iHeight;
      jcprops.jprops.JPGFile := nil;
      jcprops.jprops.state.hFile := nil;
      sFunc := 'ijlWrite(JBUFF)';
      iStatus := ijlWrite(@jcprops,IJL_JBUFF_WRITEWHOLEIMAGE);
      if iStatus < 0 then
        raise Exception.Create('Own: Error in IJL function.');
      ReallocMem(pBuf,jcprops.JPGSizeBytes);
      CacheList.AddObject(AnsiUpperCase(FileName),TObject(pBuf));
      if iCacheSize < 1000000 then
        Inc(iCacheSize,jcprops.JPGSizeBytes)
      else
      begin
        FreeMem(PByte(CacheList.Objects[0]));
        CacheList.Delete(0);
      end;
    end;
    ijlFree(@jcprops);
    Screen.Cursor := crDefault;
  except
    on E: Exception do
    begin
      (*
      Application.MessageBox(
        PChar(E.Message +
          #13'Status=' + getErrInfo(iStatus)),
        PChar(sFunc),
        MB_OK or MB_ICONERROR);
      *)
      ijlFree(@jcprops);
      Screen.Cursor := crDefault;
    end;
  end;
end;
AnTe вне форума Ответить с цитированием
Старый 07.07.2010, 14:47   #13
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Может в ней есть и другие функции, такие как поворот (Rotate) или обрезка (Crop), тогда многие вопросы снимаются.
после того, как я увидел, что требуется только для вывода..

Цитата:
Поворот растра без потери качества не бывает, можно сделать почти без потери качества, применив наилучший для этого алгоритм. Совсем без потерь он только при углах поворота 90, 180, 270.
Угу, под поворотом я имел в виду именно эти углы.

Цитата:
А вот обрезка (без масштабирования) без потерь бывает. Самый простой способ (а моежт и единственный) это распаковать JPEG в несжатый растр, сделать обрезку и запаковать обратно имеющимся кодером. Если использовать тот же кодер или лучший, чем к-рым изначально паковали, и с теми же настройками, то кач-во не потеряется. Непосредственно JPEG в том виде как он есть обрезать нельзя, т.к. он сжатый, по любому надо перепаковывать.
там вроде что-то, если обрезка по краям кадров (или как в жпег это называется) будет без потери качества. Но... что-то мне подсказывает, что сложностей будет море.

Придётся пересохранять. По крайней мере на первый, длительный, вариант.
AnTe вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как люди делают деньги на других людях? Levsha100 Свободное общение 32 15.11.2011 12:08
Обьясните что делают и означают пару строк в программном коде! FreeZeT Общие вопросы C/C++ 2 15.06.2010 03:20
Как делают микросхемы? Rembo Компьютерное железо 15 17.09.2009 18:44
Как делают симпатичный buttons на Ассемблере??? Hi-hi Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.07.2009 00:42
Как делают уникальный идентификатор строки в БД? sergey113 Помощь студентам 3 05.08.2008 17:48