Resim Boyutlarını istenilen ölçülerde zumlama

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Ottoman

Resim Boyutlarını istenilen ölçülerde zumlama

Mesaj gönderen Ottoman »

Resim Zumlama hakkında formlarda pek açıklayıcı bilgi yok,olsa bile tamamen kısıtlı kodlar veriliyor, geneldede hep adreslerle savuşturuluyor,Benim yazacağım kodlarla bir resmi tamamen özgür olarak X ve Y olaylarında kendi belirleyeceğiniz ölçülerde zumlayabileceksiniz!.Konuyla ilgili,bir çok Arkadaşın işine yarayacağını sanıyorum.Ben genelde proğramın yorulmaması,daha sağlıklı olması açısından kısa kodlar kullanırım,yazacağım kodlarda kısa olacak.

Önce Form'umuza 2 Tane Image,1 OpenPictureDialog,2 Tane Label,2 Tane Edit ve 2 Tane Button koyuyoruz.

Uses'e jpeg; ekleyiniz.(imagenin Tanımladığı tüm formatları Kullanabilirsiniz.)

Şimdi Gelelim Kodlara;
*Formumuza Fonksiyonumuzu atıyoruz.(Formumuza olduğu gibi yapıştırın).

Kod: Tümünü seç

procedure ResmiBoyutlandir(KaynakResim:string; Y:integer; G:integer);
var
 Bitmap     : TBitmap;
 img1 : TBitmap;
 XRect : TRect;
begin
 try
 Bitmap := TBitmap.Create;
 Bitmap.Width  := Form1.Image1.Picture.Width;
 Bitmap.Height := Form1.Image1.Picture.Height;
 Bitmap.Canvas.Draw(0, 0, Form1.Image1.Picture.Graphic);
 img1 := TBitmap.Create();
 img1.Height := Y;
 img1.Width := G;
 XRect := Rect(0, 0, G, Y);
 img1.Canvas.StretchDraw(XRect,bitmap);
 Form1.Image1.Picture.Graphic := bitmap; //orijinal resim
 Form1.Image2.Picture.Bitmap := img1; //boyutlandırılmış hali
 Bitmap.Free;
 img1.Free;
except
 Application.MessageBox('Hata oluştu','Hata',MB_OK+MB_ICONERROR);
end;
end;
Fonksiyonu tanımladıktan sonra, 1.button'umuza aşağıdaki kod'u ekliyoruz;

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
var//Resim'i imageye yüklüyoruz.
 yol:AnsiString;
begin
 if OpenPictureDialog1.Execute Then
 begin
  yol:=OpenPictureDialog1.FileName;
  Image1.Picture.LoadFromFile(yol);
  end;
end;
2.Buttonumuza;

Kod: Tümünü seç

procedure TForm1.BitBtn2Click(Sender: TObject);
var
 y,x:integer;
 ResimAdi,adi:String;
 begin
 try
  image2.Picture:=image1.Picture;
  y:=StrToint(Edit1.Text);
  x:=StrToint(Edit2.Text);
  adi:=extractfilename(OpenPictureDialog1.FileName);//Resmin Adını Label2 de gösteriyoruz.
  ResimAdi:=(OpenPictureDialog1.FileName);
  Label1.Caption:=ResimAdi;//Resmin Adı ve yolunu belirliyoruz.
  ResmiBoyutlandir(Label1.Caption,y,x);
  Label2.Caption :=' X : '+IntToStr(Image2.Picture.Width) + ' -' +' Y : '+IntToStr(Image2.Picture.Height) + ' pixel.  ' + 'Resmin Adı : '+adi;//Resmin adi ve en son (size) boyutunu gösteriyoruz.
 except
  ShowMessage('X ve Y nin Yeni Değerlerini giriniz?');
  end;
 end;
end;
Label1'in visible özelliğini false yapıyoruz,Formun uygun yerine yerleştirdiğimiz 2 imageden 2.cisinin altına Label2'yi koyuyoruz(Resmin adi ve en son (size) boyutunu gösterecek). 2 Tane Edit Bileşenimizide X ve Y olarak belirleyip,yanyana koyarak 2.imagenin yine uygun bir yerine yerleştiriyoruz.
Gerekli kontrolleri yaptıktan sonra OpenPictureDialogla 1.imageye getirdiğimiz herhangi bir resmi,Edit'lere yazacağımız rakamlarla, 1.imagedeki boyutlarının 2.imagede değiştiğini gözleyeceksiniz.
hayırlı çalışmalar.

***************************************
Bildiklerini Öğret'ki,Bilgili olduğun anlaşılsın.
Bilmediklerini öğren'ki cahil olduğun Anlaşılmasın.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

s.a.
Yaptığım bir emlak programında; 800*600 yada 1024*768 resimler veritabanında çok yer kapladığından, bunları özelliğini ve görüntüsünü bozmadan küçültmem gerekiyordu ben programda kısıtlama koyarak 400*500 yaptım, ama bunu kullanıcının yapması da iğne ile kuyu kazmak gibi bir şey, painte gir ordan küçült tekrar kaydet, yeniden programa yükle, ölçüleri olmadı bir daha dene vss. Bunu programın yapması gerekiyordu.
Ben de buna benzer birşeyer yaptım ama sadece bmp dosyalarında işlem yapıyordu. Foruma soracaktım,önce bir arama yapayım dedim, sizin kodu buldum. Allah razı olsun.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

İster çizim olsun ister kopyalama jpg türü dosyalar hep problem teşkil ediyor. Olmaması gereken garip garip hatalar veya yanlış sonuçlar oluşturuyor. Bu jpeglerle ilgili hassas durum hakkında bir fikri olan var mıdır acep?
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Resim boyutlarını istediğimiz pixelde kaydediyoruz ama yine veritabanında ve dosya olarak kapladığı alan bakımından çok yer tutuyor, yani pixel küçülse dahi kapladığı alan küçülmüyor, nasıl halledebiliriz.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Aranan kod bulunmuştur, ilgilenen arkadaşlara duyrulur.
Uses kısmına jpeg ekleyin

Kod: Tümünü seç

function tform1.resizeImage(sInImage, sOutImage: string; iHeight, iWidth: integer): boolean;
var
    JpgImg : TJpegImage;
    BmpImg : TBitmap;
    Rectangle: TRect;
begin
    try
    	JpgImg := TJpegImage.Create;
    	BmpImg := TBitmap.Create;
    	JpgImg.LoadFromFile(sInImage);
    	Rectangle := Rect(0, 0, iWidth, iHeight);
    	with BmpImg do begin
    	    Width := iWidth;
    	    Height := iHeight;
    	    Canvas.StretchDraw(Rectangle, JpgImg);
    	end;
    finally
    	JpgImg.Assign(BmpImg);
    	JpgImg.SaveToFile(sOutImage);
    	JpgImg.Free;
    	BmpImg.Free;
    end;
    Result := True;
end;
Gayet güzel çalışıyor...
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

WhiteRose un yolladığı koda benzer bir kodu ben webcam'den görüntü aldıktan sonra kullanıyordum. Görüntü bozulmadan oldukça küçülüyordu faydalı bir kod ve oldukça basit görüldüğü gibi...
Ayrıca whiterose resimleri veritabanında değilde dizin de tutsan daha iyi olur veritabanı uygulamalarında....
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Battosai yazdı:Ayrıca whiterose resimleri veritabanında değilde dizin de tutsan daha iyi olur veritabanı uygulamalarında....
dediğiniz tek kullanıcılı program için doğru ama, program çok kullanıcılı olunca mecburen veritabanında tutmak zorunda kalıyoruz.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

Battosai yazdı:WhiteRose un yolladığı koda benzer bir kodu ben webcam'den görüntü aldıktan sonra kullanıyordum. Görüntü bozulmadan oldukça küçülüyordu faydalı bir kod ve oldukça basit görüldüğü gibi...
Ayrıca whiterose resimleri veritabanında değilde dizin de tutsan daha iyi olur veritabanı uygulamalarında....
fb kullandığını varsayalım. çoklu kullanım olsun.

eger resimler vt de durursa fb portu açık ise yeterlidir uygulama çalışır. ama resimler yol üstünde ise bu yol herkes için aynı tanımda olmalı bu bir. server üstünde paylaşım açmak zorundasın bu da 2.

olması gereken fazla boyutu abartmadan resimlerri vt de tutmak ama jpg ve bıyut olarak kasmadan
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Cevapla