Resim Resize

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Resim Resize

Mesaj gönderen Berdem »

Merhaba Arkadaşlar,
D2007 kullanıyorum.Kaliteli bir resim resize etmek için GR32 componenti http://www.g32.org/graphics32/ kullanmak istiyorum.

Kod: Tümünü seç

uses  Jpeg, GR32, GR32_Image,GR32_Transforms,GR32_Filters;

procedure SaveImage(inBmp: TBitmap32; filename: string);
var jpeg: TJPEGImage;
    bmp: TBitmap;
begin
     jpeg := TJPEGImage.Create;
     bmp := TBitmap.Create;
     try
        bmp.Assign(inBmp);
        jpeg.CompressionQuality := 100;
        jpeg.Assign(bmp);
        jpeg.SaveToFile(filename);
     finally
            jpeg.Free;
            bmp.Free;
     end;
end;


procedure resizePicture(infile: string; outfile: string; width, height: integer;
                        aspectratio: boolean);
var srcpic, destpic:TBitmap32;
    destrect, srcrect:TRect;
begin
     srcpic:=TBitmap32.Create;
     destpic:=TBitmap32.Create;
     try
        srcpic.LoadFromFile(infile);
        if aspectratio=true then begin
           if srcpic.Height > srcpic.Width then begin
            width:=height * srcpic.width div srcpic.height;
           end else begin
            height:=width * srcpic.Height div srcpic.Width;
           end;
        end;
        try
           destpic.width:=width;
           destpic.height:=height;
           destrect:=Rect(0,0,destpic.width,destpic.height);
           srcrect:=Rect(0,0,srcpic.width,srcpic.height);
           srcpic.StretchFilter:=sfLanczos;
           destpic.Draw(destrect,srcrect,srcpic);
         finally
         srcpic.free;
        end;
     //destpic.SaveToFile(outfile);
     SaveImage(destpic, outfile);
     finally
     destpic.free;
     end;
end;
srcpic.StretchFilter:=sfLanczos; tanımlanamıyan hatası alıyorum. Yardımlarınızı bekliyorum.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Resim Resize

Mesaj gönderen aslangeri »

s.a.
hata mesajnı tam oalarak yazarsanız.
belki unitlerden birini açmayı unutmuşsunuzdur.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Resim Resize

Mesaj gönderen Berdem »

Çok teşekkür ediyorum.
[DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'StretchFilter'
[DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'sfLanczos'

Hata mesajlarını alıyorum.http://graphics32.org/documentation/Doc ... Filter.htmGR32 ünitini gösteriyor.Üniti gösterdim.Ayrıca elle lib klasörüne dcu dosyalarını yükledim.Ama olmadı...
Komponent için verilen örnekler sorunsuz çalışıyor.

Komponentsiz yapmayı denedim.Değişik hata mesajları almıştım.
Bunu forumdan almıştım.

Kod: Tümünü seç

function ResimAyari(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);
       Application.ProcessMessages;
       JpgImg.Free;
       BmpImg.Free;
    end;
    Result := True;
end;
Bunda jpeg #42 hatası aldım...

Kod: Tümünü seç

function TForm1.ResizeImg(Image: TJPegImage): TJPegImage;
var bitmap: TBitmap;
const Dispwidth = 50;
begin
  try
    bitmap := TBitmap.create;
    result := TJPegImage.create;
    bitmap.width := Dispwidth;
    bitmap.height := round(Image.Height / (Image.Width / Dispwidth));
    bitmap.canvas.stretchDraw(rect(0, 0, Dispwidth, round(Image.Height / (Image.Width / Dispwidth))), Image);
    result.Assign(bitmap);
    result.JPEGNeeded;
  finally
    bitmap.free;
  end;
end;
invalid floating point operation hata mesajı alıyorum....
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Resim Resize

Mesaj gönderen ikutluay »

Berdem yazdı:Merhaba Arkadaşlar,


srcpic.StretchFilter:=sfLanczos; tanımlanamıyan hatası alıyorum. Yardımlarınızı bekliyorum.
JCL (JVCL nin unit hali) içinde istediğiniz fonksiyon var ve sorunsuz kullanan arkadaşalr var tavsiye olunur.

forumda örnekleride var... JCL nin kurulması yeterli. örnekler için csungurayın threadlerine bakabilirsiniz.....
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
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Resim Resize

Mesaj gönderen Berdem »

Çok teşekkürler
JclGraphics.pas dosyasını unitime ekledim.

Kod: Tümünü seç

procedure SaveImaged(inBmp: TBitmap; filename: string);
var jpeg: TJPEGImage;
  bmp: TBitmap;
begin
  jpeg := TJPEGImage.Create;
  bmp := TBitmap.Create;
  try
    bmp.Assign(inBmp);
    jpeg.CompressionQuality := 100;
    jpeg.Assign(bmp);
    jpeg.SaveToFile(filename);
  finally
    jpeg.Free;
    bmp.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  destpic: TBitmap;
  jpeg: TJPEGImage;
begin
  destpic := TBitmap.Create;
  jpeg := TJPEGImage.Create;
  jpeg.LoadFromFile('bn.jpg');
  Stretch(1024, 768, rfLanczos3, 0, jpeg, destpic);
  SaveImaged(destpic, 'bn2.jpg');
  destpic.Free;
  jpeg.Free;
end;
bu şekilde denedim...
Jpeg error #53 hatası alıyorum...

Yardımlarınızı bekliyorum.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Resim Resize

Mesaj gönderen emin_as »

Jpeg dosyasini kontrol et, başka jpeg dosyalariyla dene.
Jpeg dosyan bozuk olabilir veya hafızaya sıgmayacak kadar büyük olabilir.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Resim Resize

Mesaj gönderen ikutluay »

Merhaba

JPEG dosyasını xnview ile filan bir deneyin... Birde illi unitlerde hata mesajının açıklaması mutlaka vardır.
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
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Resim Resize

Mesaj gönderen Berdem »

emin_as yazdı:Jpeg dosyasini kontrol et, başka jpeg dosyalariyla dene.
Jpeg dosyan bozuk olabilir veya hafızaya sıgmayacak kadar büyük olabilir.
Teşekkürler..Gerçektende dediğiniz gibi oldu.Resim dosyası hafızaya almadı.
Sanırım hata verdi. Peki bu sorunu nasıl çözebiliriz...
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Resim Resize

Mesaj gönderen emin_as »

Resmini küçük parçalara bölüp, bunları bir arada kullanabilirsin. Ama bu tür teknikler ugraştırır.
Aşagıdaki linkler sorunun nedeni hakkında fikir verebilir.

http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.htm
http://delphi.newswhat.com/geoxml/forum ... orland.com
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Resim Resize

Mesaj gönderen ikutluay »

alternatif olarak resmin boyultarını bulup komut satırından iview ile resize etmende mümkün (denenmiş bir yöntemdir)
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
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Resim Resize

Mesaj gönderen Berdem »

Örnekleri ve internetten araştırmam sonucu PixelFormat:=pf24bit; büyük dosyaları için pixel boyutunun verilmesi şeklinde idi.Ama

Kod: Tümünü seç

  destpic.Height:=jpeg.Height;
  destpic.Width:=jpeg.Width;
  destpic.PixelFormat:=pf24bit;
  destpic.Canvas.Draw(0, 0, jpeg);
yazsamda yine büyük boyutta jpegte hata veriyor...Önerilerinizi bekliyorum.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  destpic: TBitmap;
  jpeg: TJPEGImage;
  x,y:integer;
begin
  destpic := TBitmap.Create;
  jpeg := TJPEGImage.Create;
  jpeg.LoadFromFile('bn.jpg');
  destpic.Height:=jpeg.Height;
  destpic.Width:=jpeg.Width;
  destpic.PixelFormat:=pf32bit;
  destpic.Canvas.Draw(0, 0, jpeg);
  x:=Round(jpeg.Height div 4);
  y:=Round(jpeg.Width div 4);
  Stretch(y, x, rfLanczos3, 0, jpeg, destpic);
  SaveImaged(destpic, 'a10001mmmm.jpg');
  destpic.Free;
  jpeg.Free;
end;

procedure TForm1.SaveImaged(inBmp: TBitmap; filename: string);
var jpeg: TJPEGImage;
  bmp: TBitmap;
begin
   jpeg := TJPEGImage.Create;
   bmp := TBitmap.Create;
  try
    bmp.Assign(inBmp);
//    jpeg.PixelFormat:=jf24Bit
//    jpeg.Width:=bmp.Width;
//    jpeg.Height:=bmp.Height;
//    Canvas.Draw(0,0,bmp);
    jpeg.CompressionQuality := 100;
    jpeg.Assign(bmp);
    //JPEG.JPEGNeeded;
    jpeg.SaveToFile(filename);
  finally
    jpeg.Free;
    bmp.Free;
  end;
end;
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Resim Resize

Mesaj gönderen Berdem »

Teşekkürler.Konu ile ilgili olabilecek arkadaşlar içn sorunu xnview sdk sı ile çözdüm.İçinde delphi ile ilgili örnegide var.
http://pagesperso-orange.fr/pierre.g/xnview/engfl.html
Cevapla