Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

Bmp -->JPG   Найти похожие ветки 

 
ser_ega   (2004-11-05 23:14) [0]

Мастера помогите! Как такой код

Bmp := TBitMap.Create;
 try
  ARect := Rect(701,776,766,806);
  with Bmp, Arect do begin
    Height :=Bottom - Top;
    Width :=Right-Left;
    Canvas.CopyRect(Rect(0,0,Width,Height), Image1.Canvas, ARect);
  end;
  Bmp.SaveToFile("c:\copyrect.bmp");
  finally
    Bmp.Free;
  end;

переделать так чтобы, выделенный фрагмент сохранялся в JPG?


 
Mihey_temporary ©   (2004-11-06 00:46) [1]

В справке Delphi набери "TGraphic.SaveToFile" и посмотри пример.


 
ser_ega   (2004-11-06 17:52) [2]

Я его переделал так:

Bmp := TJpegImage.Create;
 try
  ARect := Rect(50,50,100,100);
  with  Arect do begin
    Height :=Bottom - Top;
    Width :=Right-Left;
    Canvas.CopyRect(Rect(0,0,Width,Height), Image1.Canvas, ARect);
  end;
  Bmp.SaveToFile("c:\copyrect.jpg");
  finally
    Bmp.Free;
  end;

А при обработке этой процедуры выдается такая ошибка - Can only modify am image if it contains a bitmap. Как это исправить?


 
ser_ega   (2004-11-06 22:52) [3]

Удалено модератором


 
Mihey_temporary ©   (2004-11-06 23:00) [4]

Подключай воображение. Примерно так:


var
 jp: TJpegImage;  
begin
 Bmp := TBitMap.Create;
 jp := TJpegImage.Create;
 try
  ARect := Rect(701,776,766,806);
  with Bmp, Arect do
   begin
    Height := Bottom - Top;
    Width := Right-Left;
    Canvas.CopyRect(Rect(0,0,Width,Height), SomeSource.Canvas, ARect);
   end;
   with jp do
   begin
     Assign(Bmp);
     SaveToFile("c:\oneeye.jpg")
   end;
 finally
   jp.Free;
   Bmp.Free;
 end;


 
ser_ega   (2004-11-06 23:39) [5]

Mihey_temporary Ваш пример тоже выдает ту же ошибку!

Что такое SomeSource? У меня в Image1 находится JPG. Прикол в том что если я В Image1 загружаю Bmp то все работает, а вот с Jpg проблемки!


 
ser_ega   (2004-11-07 12:13) [6]

Подскажите может другое решение моей проблемы найдется! Я Вас очень прошу!


 
Mihey_temporary ©   (2004-11-07 17:43) [7]

Кусок кода:


procedure TmainForm.btnSaveClick(Sender: TObject);

 procedure SetBitmapSize(var ABitmap: TBitmap;
   Width, Height: Integer);
  begin
    ABitmap.Width := Width;
    ABitmap.Height := Height;
  end;

var
 InternalBitmap: TBitmap;
 TheOneToSave: TBitmap;
 jp: TJPEGImage;
 ARect: TRect;
begin
 ARect := Rect(StrToInt(edLeft.Text), StrToInt(edTop.Text),
   StrToInt(edRight.Text), StrToInt(edBottom.Text));
 If Image.Picture.Graphic <> nil then
  begin
   TheOneToSave := TBitmap.Create;
   SetBitmapSize(TheOneToSave, ARect.Right-ARect.Left,
     ARect.Bottom-ARect.Top);
   try
     InternalBitmap := TBitmap.Create;
     try
       SetBitmapSize(InternalBitmap, Image.Picture.Graphic.Width,
         Image.Picture.Graphic.Height);
       InternalBitmap.Canvas.Draw(0, 0, Image.Picture.Graphic);
       TheOneToSave.Canvas.CopyRect(Rect(0, 0, TheOneToSave.Width,
         TheOneToSave.Height), InternalBitmap.Canvas, ARect);
      finally
        InternalBitmap.Free;
      end;
      // Saving JPEG...
     jp := TJpegImage.Create;
     try
      with jp do
       begin
        Assign(TheOneToSave);
        SaveToFile("temp1.jpg");
       end;
     finally
      jp.Free;
     end;
   finally
     TheOneToSave.Free;
   end;
  end
   else
    begin
      MessageDlg("No image loaded!", mtError, [mbOk], 0);
    end;
end;


И готовый архив:
http://www.hot.ee/mvps19/JpegWork.rar  [242 Kb]


 
ser_ega   (2004-11-07 18:11) [8]

Большое Вам спасибо! Может вы мне еще подскажите как очистить Image от картинки, а то при попытке закрыть форму выскакивает окно "Процессор". Я думаю это потому что в Image картинка большого размера (2500 Х 3500). А уменьшать его не хочется т.к. уменьшится и нужный мне фрагмент. Может вы посоветуете более рациональный способ! Еще раз СПАСИБО!


 
Mihey_temporary ©   (2004-11-07 19:47) [9]

Очистить можно так:


Image.Picture.Graphic := nil;


При этом TImage сам освобождает память (нет потери указателей, как может показаться). Это легко проверить:


var Gr: TGraphic;
Gr := Image.Picture.Graphic;
Image.Picture.Graphic := nil;
Gr.Free; // <- вызовет ошибку, т.к. Gr уже освобождён



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
9-1100334142
mozartw
2004-11-13 11:22
2005.02.20
Как сотрудничают 3dmax и compiler


3-1106047185
Midpad
2005-01-18 14:19
2005.02.20
как задать ширину столбца при передаче в Word?


1-1107333696
GreySerg
2005-02-02 11:41
2005.02.20
Как задать Title приложения при Group similar taskbar buttons ?


14-1106780098
VID
2005-01-27 01:54
2005.02.20
Токио (или Tokyo) - Индира Ганди.mp3


1-1107707313
beginnn
2005-02-06 19:28
2005.02.20
StatusBar