İmaj Compress

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

İmaj Compress

Mesaj gönderen tuna »

Merhaba arkadaşlar.
Elimde bulunan resimleri yazdığım program aracılığıyla internette bi alana atıyorum.
Ancak resimleri internete gönderirken resmin boyutunu çözünürlüğünü vs. küçültmem ve ağırlığını compress etmem gerekiyor (Resim kareleşmeden).
Bu işlemi forumda yazılanlara göre yapmaya çalıştım ama birtürlü beceremedim. Forumda baya bi arama yaptım hemen hemen bütün örnekleri denedim ama olmuyor.
Ya dosya bozuluyor hiç açılmıyor yada yazılan örneklerdeki kodlar hata veriyor.
Daha önce böyle bir işlem yapmış olan arkadaşlar varsa yardımcı olabilirmi.

Not: Delphi 2007 kullanıyorum.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: İmaj Compress

Mesaj gönderen csunguray »

Aşağıda bir TImage içerisindeki resmi veritabanına kaydetmeye yarayan bir örnek var. Bu kod kalıbını ben yıllardır kullanıyorum. Bu örneği inceleyin ve kendi programınıza uygulayın. Takıldığınız yerlerde beraber çözmeye çalışalım. Örnekte Jedi Code Library içerisindeki JclGraphics uniti kullanılmıştır.


Kod: Tümünü seç

uses Db, Jpeg, ClipBrd, DBISAMTb, JclGraphics;

// *********************** KAYDEDERKEN *******************
var
  Stream1: TDBISAMBlobStream; // BDE için TBlobStream kullanılmalı, diğer
DB'ler için de bir karşılığı vardır sanırım.
  Jpeg1: TJpegImage;


var
  Oran, OranW, OranH : Real;
  CompressedImage: TImage;

  // RESİM BOYUTLANDIR
  if Image1.Picture.Graphic<>nil then
  begin
    if (Image1.Picture.Graphic.Width >100) or
(Image1.Picture.Graphic.Height>130) then
    begin
    //    ShowMessage('Genişlik: '+IntToStr(Image1.Picture.Graphic.Width)+'
Yükseklik: '+IntToStr(Image1.Picture.Graphic.Height));
      CompressedImage:=TImage.Create(Self);
      OranW:=100/Image1.Picture.Graphic.Width;
      OranH:=130/Image1.Picture.Graphic.Height;
      if OranW>OranH then Oran:=OranH else Oran:=OranW;
      Stretch(Round(Image1.Picture.Graphic.Width*Oran),
              Round(Image1.Picture.Graphic.Height*Oran),
              rfBell, 1, Image1.Picture.Graphic,
CompressedImage.Picture.Bitmap);
      Image1.Picture.Bitmap.Assign(CompressedImage.Picture.Bitmap);
      CompressedImage.Free;
    //    ShowMessage('Küçültüldü Genişlik:
'+IntToStr(Image1.Picture.Bitmap.Width)+'  Yükseklik:
'+IntToStr(Image1.Picture.Bitmap.Height));
    end;
  end;

  // JPEG FORMATINA ÇEVİR
  try
    Stream1:=TDBISAMBlobStream.Create(DM.PersonelRESIMJPG, bmWrite);
    Jpeg1:=TJpegImage.Create;
    if Image1.Picture.Graphic<>nil then
    begin
      if not Image1.Picture.Graphic.Empty then
      begin
        if Image1.Picture.Graphic is TJpegImage then
        begin
          Image1.Picture.Graphic.SaveToStream(Stream1);
          // ShowMessage('O bir jpeg. size='+IntToStr(Stream1.Size));
        end else begin
          Jpeg1.Assign(Image1.Picture.Graphic);
          Jpeg1.Compress;
          Jpeg1.SaveToStream(Stream1);
          // ShowMessage('O bir jpeg değil. size='+IntToStr(Stream1.Size));
        end;
      end;
    end;
  finally
    Jpeg1.Free;
    Stream1.Free;
  end;


// *********************** OKURKEN *******************

  // Resim Aç
  if not DM.PersonelRESIMJPG.IsNull then
  begin
    try
      Stream1:=TDBISAMBlobStream.Create(DM.PersonelRESIMJPG, bmRead);
      Jpeg1:=TJpegImage.Create;
      Jpeg1.LoadFromStream(Stream1);
      Image1.Picture.Bitmap.Assign(Jpeg1);
    finally
      Jpeg1.Free;
      Stream1.Free;
    end;
  end else begin
    Image1.Picture.Graphic:=nil;
  end;

********** NOTLAR ******************
* Form üzerinde TDBImage değil normal TImage var.
* JCLGraphics, Jedi Code Library nin bir parçasıdır.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: İmaj Compress

Mesaj gönderen tuna »

Hocam ellirinize sağlık.
Bazı problemlerim var kodu çalıştırırken hocam. Şimdi siz bu kodu veritabnına imaj kaydetmek için yazmışsınız. Ancak ben veri tabanına değilde mesela c: nin altına
kaydetmek istiyorum. (aslında internette bi alana ftp ile atıyorum);
şimdi:
Stream1:=TDBISAMBlobStream.Create(DM.PersonelRESIMJPG, bmWrite); buradaki kodu ne yapmalıyımki c: nin içine kaydetsin.
zaten uses "DBISAMTb" ve Stream1: TDBISAMBlobStream; hata veriyor
([DCC Error] Unit8.pas(7): F1026 File not found: 'DBISAMTb.dcu') delphi 2007 de çalıştırıyorum. veri tabanına kayıt yaptırmayacağım için
bu dosyayı aramama gerek yok.

Tekrar tekrar teşekürler hocam.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: İmaj Compress

Mesaj gönderen csunguray »

İlk olarak DBIsamTB'yi uses listesinden kaldır.

Stream1 i de sil. Bir resmi C: ye kaydetmek istiyorsan Image1.SaveToFile ile kaydedebilirsin. Daha sonrasında bir ftp ye yüklemek istiyorsan Indy bileşenlerini (TIdFtp) kullanarak bunu yapabilirsin.


Kod: Tümünü seç

  Ftp1.Host:=FtpServer.Text;
  Ftp1.Username:=FtpUser.Text;
  Ftp1.Password:=FtpPassword.Text;
  try
    EditMesaj.Caption:='İnternet: Bağlantı kuruluyor...';
    Application.ProcessMessages;
    FTP1.Connect;
  except
    EditMesaj.Caption:='İnternet: Bağlantı kurulamadı...';
    Application.ProcessMessages;
    ShowMessage('Bağlantı başarısız!');
    Ftp1.Disconnect;
    Exit;
  end;
  try
    EditMesaj.Caption:='İnternet: Kullanıcı adı ve şifre doğrulanıyor...';
    Application.ProcessMessages;
    Ftp1.Login;
  except
    EditMesaj.Caption:='İnternet: Yanlış kullanıcı adı veya şifre...';
    Application.ProcessMessages;
    ShowMessage('Kullanıcı adı/şifre hatası!');
    Ftp1.Disconnect;
    Exit;
  end;
  if FtpDir.Text>'' then
  begin
    try
      EditMesaj.Caption:='İnternet: Klasöre konumlanılıyor...';
      Application.ProcessMessages;
      Ftp1.ChangeDir(FtpDir.Text);
    except
      EditMesaj.Caption:='İnternet: Klasör bulunamadı...';
      Application.ProcessMessages;
      ShowMessage('Belirtilen klasör bulunamadı!');
      Ftp1.Disconnect;
      Exit;
    end;
  end;
  try
    EditMesaj.Caption:='İnternet: Yükleme yapılıyor...';
    Ftp1.Put('.\dys.mdb', 'dys.mdb');
    EditMesaj.Caption:='İnternet: Yükleme başarıyla tamamlandı...';
//    ShowMessage('İnternet: Yükleme başarıyla tamamlandı...');
  except
    EditMesaj.Caption:='İnternet: Yükleme başarısız...';
    ShowMessage('Yükleme başarısız!');
    Ftp1.Disconnect;
    Exit;
  end;
  Ftp1.Disconnect;

C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: İmaj Compress

Mesaj gönderen tuna »

Hocam problemi biraz uğraşınca çözdüm. :)

şöyleki:

Stream1:=TDBISAMBlobStream ---> Stream1: TMemoryStream; bu şekilde değiştirdim.
Stream1:=TDBISAMBlobStream.Create(DM.PersonelRESIMJPG, bmWrite); --->
OpenDialog1.Execute;
Stream1:=TMemoryStream.Create;
stream1.LoadFromFile(OpenDialog1.FileName); şeklinde değiştirdim.

Kaydetme işleminide:
Jpeg1.SaveToStream(Stream1);
SaveDialog1.Execute;
jpeg1.SaveToFile(SaveDialog1.FileName); diye değiştirince olay çözüldü hocam....

Diğer arkadaşlara örnek teşkiletmesi açısından tam kodu aşağıya ekliyorum.

Kod: Tümünü seç

unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Jpeg, ClipBrd, JclGraphics, StdCtrls, ExtCtrls;

type
  TForm8 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form8: TForm8;
  Jpeg1: TJpegImage;
  Stream1: TMemoryStream;
  Oran, OranW, OranH : Real;
  CompressedImage: TImage;

implementation

{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
begin
//RESİM DOSYASINI AÇMA İŞLEMİ....
try
  OpenDialog1.Execute;
  Stream1:=TMemoryStream.Create;
  stream1.LoadFromFile(OpenDialog1.FileName);
  Jpeg1:=TJpegImage.Create;
  Jpeg1.LoadFromStream(Stream1);
  Image1.Picture.Bitmap.Assign(Jpeg1);
finally
  Jpeg1.Free;
  Stream1.Free;
end;
end;

procedure TForm8.Button2Click(Sender: TObject);
begin
//GÖRÜNTÜLEME VE KAYDETME İŞLEMİ. isteyen bu ikisini ayrı ayrı butonlara koyabilir....
if Image1.Picture.Graphic<>nil then
  begin
    if (Image1.Picture.Graphic.Width >100) or (Image1.Picture.Graphic.Height>130) then
      begin
        //ShowMessage('Genişlik: '+IntToStr(Image1.Picture.Graphic.Width)+'Yükseklik: '+IntToStr(Image1.Picture.Graphic.Height));
        CompressedImage:=TImage.Create(Self);
        OranW:=100/Image1.Picture.Graphic.Width;
        OranH:=130/Image1.Picture.Graphic.Height;
        if OranW>OranH then Oran:=OranH else Oran:=OranW;
        Stretch(Round(Image1.Picture.Graphic.Width*Oran),
        Round(Image1.Picture.Graphic.Height*Oran),
        rfBell, 1, Image1.Picture.Graphic,
        CompressedImage.Picture.Bitmap);
        Image1.Picture.Bitmap.Assign(CompressedImage.Picture.Bitmap);
        CompressedImage.Free;
        //ShowMessage('Küçültüldü Genişlik:'+IntToStr(Image1.Picture.Bitmap.Width)+'  Yükseklik:'+IntToStr(Image1.Picture.Bitmap.Height));
      end;
  end;

  // JPEG FORMATINA ÇEVİR
  try
    Stream1:=TMemoryStream.Create;
    Jpeg1:=TJpegImage.Create;
    if Image1.Picture.Graphic<>nil then
      begin
        if not Image1.Picture.Graphic.Empty then
          begin
            if Image1.Picture.Graphic is TJpegImage then
            begin
              Image1.Picture.Graphic.SaveToStream(Stream1);
              // ShowMessage('O bir jpeg. size='+IntToStr(Stream1.Size));
            end else begin
              Jpeg1.Assign(Image1.Picture.Graphic);
              Jpeg1.Compress;
              Jpeg1.SaveToStream(Stream1);
              SaveDialog1.Execute;
              jpeg1.SaveToFile(SaveDialog1.FileName);
              // ShowMessage('O bir jpeg değil. size='+IntToStr(Stream1.Size));
            end;
        end;
    end;
  finally
    Jpeg1.Free;
    Stream1.Free;
  end;
end;

end.
Cevapla