Конференция "Media" » изменение размеров картинки Дельфей и ее сохранение... [D7, WinXP]
 
  • Conferno (05.09.08 22:47) [0]
    всем привет!
    тут такая тема.. нужно взять картинку(неважно какого разрешения) формата jpg и средствами дельфи уменьшить по пропорциям до определенного размера, а затем пересохранить.
    то биш была у нас картинка 1024х768, мы ее изменили в 640х480- и теперь следует сохранить в определенное место такого разрешения опять ж в формат jpg.

    пробовал загружать напрямую, изменять параметры и пересохранять(пишу по памяти):

    var
    jpg: tjpegimage;
    begin
    jpg:= tjpegimage.create;
    jpg.loadfromfile('*.jpg');
    jpg.width:= newvalueW;
    jpg.Height:= newvalueH;
    jpg.savetofile('c:/1.jpg');
    end;


    в общем выдает ошибку, что мол JPEG Width не может быть изменена. Вооот.. (( Надо както по другому..(
    Никто не подскажет? ото в голове вообще как-то больше идей никаких нет..
  • MBo © (06.09.08 10:10) [1]
    Bitmap.Assign(jpg)
    далее изменить размеры битмапа (StretchDraw, например, или другими методами), и обратно в jpg
  • Conferno (06.09.08 11:50) [2]
    о-о-о, все, разобрался, спасибо за нужное направление ;)))
  • skinny (12.11.09 09:29) [3]
    я не разобрался
    а нельзя ли рабочий вариант посмотреть?
  • MBo © (12.11.09 09:40) [4]
    а какой именно этап непонятен?
  • denissoft (09.01.11 22:25) [5]
    procedure ImageJPGSizeWH(File1,file2:string;W,H:integer);
    var
     sr:  TSearchRec;
     img: TPicture;
     bmp: TBitmap;
     pic: TBitMap;
    begin
     img := TPicture.Create;
     bmp := TBitMap.Create;
     pic := TBitMap.Create;
     img.LoadFromFile(File1);
     bmp.Assign(img.Graphic);
     pic.Width := W;
     pic.Height:= H;
     pic.Canvas.StretchDraw(Rect(0,0,pic.Width, pic.Height), bmp);
     pic.SaveToFile(file2);
     img.Free;
     bmp.Free;
     pic.Free;
    end;
  • Плохиш © (10.01.11 10:21) [6]

    > а нельзя ли рабочий вариант посмотреть?


    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;

  • Плохиш © (10.01.11 11:05) [7]

    > denissoft

    Некроман, блин...
  • Студент (12.01.11 12:25) [8]
    эм... А что такого не так с [5] ?
  • Плохиш © (12.01.11 19:13) [9]

    > Студент   (12.01.11 12:25) [8]
    >
    > эм... А что такого не так с [5] ?

    Труп двух летней давности выкопан.
  • RGV © (20.01.11 03:43) [10]
    Для Гладкого стретча можно так

    Procedure ReSizeJpeg(var jpg:TJpegImage; NewWidth,NewHeight:integer);
    var
     bmp,sbmp:Tbitmap;
    begin
     bmp:=Tbitmap.create;
     bmp.assign(jpg);
     sbmp:=Tbitmap.create;
     sbmp.width:=NewWidth;
     sbmp.Height:=NewHeight;
     sbmp.pixelFormat:=pf24bit;
     SetStretchBltMode(sbmp.canvas.handle,4);// мягкое растягивание
     StretchBlt(sbmp.canvas.handle,0,0,NewWidth,NewHeight,bmp.canvas.handle,
                   0,0,bmp.width,bmp.height,SRCCOPY);
     jpg.assign(sbmp);
     jpg.compressQuality := 90;  //существенно уменьшает размер файла, качество  на глаз не хуже
     jpg.compress;
     sbmp.free;
     bmp.free;
    end;

  • sbs84 (03.08.11 12:26) [11]
    RGV, большое спасибо. Всё работает!
  • vivaldi (12.10.11 09:20) [12]
    Как использовать какую либо из этих функций в моем случае.У меня есть сохраненное изображение С:\1.jpeg c с размером 218X241 мне нужно его растянуть с минимальной потерей качества(желательно) до 827x1063.Какую функцию нужно использовать и как?Пробовал использовать функцию ImageJPGSizeWH и  ReSizeJpeg но пишет ошибку jpg error #53.Что посоветуете?
  • QAZ (12.10.11 09:54) [13]

    > vivaldi   (12.10.11 09:20) [12]

    да ты фантазер однако :D
  • vivaldi (12.10.11 10:32) [14]
    Задаю вопрос проще у меня есть изображение С:\1.jpeg c с размером 218X241 как его растянуть до 827x1063 и сохранить как С:\2.jpeg.Уж проще некуда
  • Омлет © (12.10.11 10:42) [15]
    > vivaldi   (12.10.11 10:32) [14]

    1. Загрузить.
    2. Растянуть.
    3. Сохранить.

    На какой стадии загвоздка?
  • vivaldi (12.10.11 11:00) [16]
    Загружать её не нужно она находится на форме в image1.Я не знаю как её растянуть до 827x1063.
  • vivaldi (12.10.11 11:00) [17]
    Загружать её не нужно она находится на форме в image1.Я не знаю как её растянуть до 827x1063.
  • Омлет © (12.10.11 11:20) [18]
    > Я не знаю как её растянуть до 827x1063.

    with Image1 do
    begin
     Stretch := true;
     SetBounds(Left, Top, 827, 1063);
    end;

  • vivaldi (12.10.11 12:02) [19]
    Написал в кнопку этот код
    with Img1 dobegin  Stretch := true;  SetBounds(Left, Top, 827, 1063);end;

    с картинкой ничего не просходит.
    Может нужно как то через canvas сделать потому что эту картинку я получаю вырезая область экрана с помощью

    var L,R,B,T:Extended;
    ax,ay:Extended
    ax:=Image1.Picture.Width/Image1.Width;
    ay:=Image1.Picture.Width/Image1.Height;
    L:=(Image1.Left-Image1.Left);
    R:=(L+Image1.Width)*ax;
    B:=Image1.top*ay;
    T:=B+(Image1.Height*ay));
    Image1.Width:=round(R-L);
    Image1.Height:=round(T-B);
    Image1.Canvas.Draw(round(-L),round(-B),Image1.Picture.Graphic);


    После этого я приравниваю изображение в Img1 к Image.Кодом
    img1.Picture.Graphic:=Image1.Picture.Graphic;


    После сохраняю,Он сохраняет его с размером Image1(218X241).
    А мне нужно предварительно img1 увеличить,а потом сохранить
 
Конференция "Media" » изменение размеров картинки Дельфей и ее сохранение... [D7, WinXP]
Есть новые Нет новых   [118451   +42][b:0][p:0.003]