Конференция "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 увеличить,а потом сохранить
  • Омлет © (12.10.11 12:15) [20]
    Простите меня, но... OMG! WTF!?
    Опиши задачу с самого начала, в том числе про обрезку.
  • Омлет © (12.10.11 12:19) [21]
    > L:=(Image1.Left-Image1.Left);

    Дао невыразимо.
  • QAZ (12.10.11 13:01) [22]
    это чо, очередная экранная лупа чтоле?
  • vivaldi (12.10.11 20:43) [23]

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    Srect,Drect,PosForme:TRect;
    iWidth,iHeight:Integer;
    iTmpX,iTmpY:Real;
    C:TCanvas;

    begin
     If not IsIconic(Application.Handle) then
     begin
     
      PosForme:=Rect(Form1.Left,Form1.Top,Form1.Left+Form1.Width,Form1.Top+Form1.Height);
      if not PtInRect(PosForme,Kursor) then
       begin
        if Panel1.Visible=True then Panel1.Visible:=False;
        if Image1.Visible=False then Image1.Visible:=True;
        iWidth:=Image1.Width;
        iHeight:=Image1.Height;
        Drect:=Rect(0,0,iWidth,iHeight);
        iTmpX:=iWidth / (Slider.Position * 2);
        iTmpY:=iHeight / (Slider.Position * 2);
        Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
        InflateRect(Srect,Round(iTmpX),Round(iTmpY));
        // move Srect if outside visible area of the screen
        if Srect.Left<0 then OffsetRect(Srect,-Srect.Left,0);
        if Srect.Top<0 then OffsetRect(Srect,0,-Srect.Top);
        if Srect.Right>Screen.Width then OffsetRect(Srect,-(Srect.Right-Screen.Width),0);
        if Srect.Bottom>Screen.Height then OffsetRect(Srect,0,-(Srect.Bottom-Screen.Height));
        C:=TCanvas.Create;
         try
          C.Handle:=GetDC(GetDesktopWindow);
          Image1.Canvas.CopyRect(Drect,C,Srect);
         finally
          C.Free;
         end;
        //if cbSrediste.Checked=True then
        { begin // show crosshair
          with Image1.Canvas do
           begin
            DmX:=Slider.Position * 2 * (Kursor.X-Srect.Left);
            DmY:=Slider.Position * 2 * (Kursor.Y-Srect.Top);
        MoveTo(DmX - (iWidth div 4),DmY); // -
        LineTo(DmX + (iWidth div 4),DmY); // -
         MoveTo(DmX,DmY - (iHeight div 4)); // |
        LineTo(DmX,DmY + (iHeight div 4)); // |
           end; // with image1.Canvas
         end; }
    // show crosshair
        Application.ProcessMessages;
       end // Cursor not inside form
      else
       begin  // cursor inside form
        if Panel1.Visible=False then Panel1.Visible:=True;
        if Image1.Visible=True then Image1.Visible:=False;
       end;
    end; // IsIconic
    end;

    procedure TForm1.btn1Click(Sender: TObject);
    var L,R,B,T:Extended;
    aX,aY :Extended;
    begin
    ax:= Image1.Picture.Width/Image1.Width;
    aY:= Image1.Picture.Height/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.Picture.Graphic:=Image1.Picture.Graphic;
     end;


    Этот код я взял из программы zoom(увеличение части изображения).Не совсем понимаю как он работает.Но результат таков он показывает в image1 часть изображения возле курсора когда я вне формы.При нажатии на TForm1.btn1Click он дублирует это изображение в img1.После этого я могу сохранить его,но с маленьким разрешением.А мне нужно растянуть его.
  • vivaldi (13.10.11 09:24) [24]
    Все я разобрался как увеличивать изображение,с одной проблемкой.Всем спасибо.Создам новую тему
  • comp © (09.09.13 10:47) [25]
    Понимаю что лютый некропостинг, но не могу не поблагодарить RGV
    за алгоритм стретча со сглаживанием.
    Весь моск себе вынес, пытаясь сгенерить нормальные превьюшки, и тут такое простое и эффективное решение.
    Огромное спасибо!
  • vmc (05.03.15 17:21) [26]
    Поддержу всё же)
    Спасибо, RGV

    Я люблю голубые ладони
    И железный занавес на красном фоне
    Сырые губы под вороньём
    И тела изъеденные червём
    Я люблю глухое эхо
    И гнилую жижу в моей голове
    Родную плесень икоты бля бу
    Я некрофил,я люблю себя
         
            Рождённому мёртвым
            Пришейте пуговицы вместо глаз

            Некрофилия некрофилия
            Моя изнурённая некрофилия

    Я люблю умирать напоказ
    Погружаясь по горло в любую грязь
    Я люблю путёвый оргазм
    И распухший от кала свой унитаз

            А рано утром
            Я встану в очередь в мавзолей

            Некрофилия некрофилия
            Моя изнурённая некрофилия

    Я люблю голубые ладони
    И железный занавес на красном фоне
    Сырые губы под вороньём
    И тела изъеденные червём
    Я люблю глухое эхо
    И гнилую жижу в моей голове,
    Родную плесень икоты бля бу
    Я некрофил,я люблю себя

            Рано утром
            Мы встанем в очередь в мавзолей

            Некрофилия некрофилия
            Моя изнурённая некрофилия

    Подробности на официальном сайте «Гражданской Обороны» http://www.gr-oborona.ru/texts/1056909643.html#ixzz3TWc5bkLZ
 
Конференция "Media" » изменение размеров картинки Дельфей и ее сохранение... [D7, WinXP]
Есть новые Нет новых   [134427   +36][b:0][p:0.004]