jpeg oval kenar verme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
alren
Üye
Mesajlar: 4
Kayıt: 26 Nis 2011 08:57

jpeg oval kenar verme

Mesaj gönderen alren »

iyi geceler.

Databaseden aldığım fotoğrafların (jpeg) kenarlarını ovalleştirerek basmak istiyorum ama ne kullanmam gerektiğini bir türlü bulamadım. canvas.roundrect var yakın olarak ama onu da çizdirmeyi becerebildim fotoğrafta oynama yapamadım. Acil cevap verebilen olursa çok sevinirim.
Şimdiden teşekkürler...
alren
Üye
Mesajlar: 4
Kayıt: 26 Nis 2011 08:57

Re: jpeg oval kenar verme

Mesaj gönderen alren »

hiç kimsenin bu konuyla ilgili bi fikri yok mu? delphide bunun yapılamayacak olmasına inanmak istemiyorum..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: jpeg oval kenar verme

Mesaj gönderen mrmarman »

Üç aşamalı bir çözüm üretmek lazım.

- İlk aşama şablon olması açısından istenen şekli (kenarları oval) içeren bir resim üretmek.

- ikinci aşama satır satır bu şablonu scanline ile okuyarak şartlara uyan yani oval içerisine denk gelen renk ile güdümlenerek kaynak resimden hedef resim üretmek. Bu hedef ürün resim üretilirken de oval dışındaki kalan kısmı transparan olması için renk vermek.

- Sonra da TImage nesnesine geri yükleyerek transparan kısımların uygulamaya geçmesini sağlamak.

Aşağıdaki adımlar görsel olarak ne yapılması gerektiğini özetler diye değerlendiriyorum.

Orjinal Image:
Resim

Maske Image:
Resim

Ürün Image:
Resim

Başarılar.
Resim
Resim ....Resim
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: jpeg oval kenar verme

Mesaj gönderen burak_489 »

alren yazdı:hiç kimsenin bu konuyla ilgili bi fikri yok mu? delphide bunun yapılamayacak olmasına inanmak istemiyorum..
jpg resmini imageye alıyorsun zaten ondan sonra canvasın boyutları da belli.oval şekil çizen bi komut vardı tam bilmiyorum şuan onun içi boş olanı ile bruscopy diyerek alabilirsin.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: jpeg oval kenar verme

Mesaj gönderen emin_as »

Region larla halledebilirsin. CreateRoundRect

Regionlarla ilgili bölüm:
http://101.lv/learn/delphi/ch12.htm#Heading6
CreateRoundRectRgn:
http://msdn.microsoft.com/en-us/library ... s.85).aspx

CreateRoundRectRgn ile oval bir region yarat ve çizimini yaptıgın canvas için bu rgn i seç.

Kod: Tümünü seç

  Rgn : HRGN;
  ....
  Rgn := CreateRoundRectRgn(50, 50, 250, 250,10,10);
  SelectClipRgn(Canvas.Handle, Rgn);
  Canvas.Draw(0, 0, Bitmap); // canvas draw işlemleri
  ...
  SelectClipRgn(Canvas.Handle,0); // region ı iptal etme için 
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: jpeg oval kenar verme

Mesaj gönderen mrmarman »

Resim

Hazırladığım procedure...

Kod: Tümünü seç

procedure OvalYap(Image: TImage; R: Integer);
type
  TRGBArray = array[0..32767] of TRGBTriple;
  pRGBArray = ^TRGBArray;
Const
 clTransp = $111213; // transparent color
Var
  Bitmap      : TBitmap; // Orjinal Image...
  MaskeBitmap : TBitmap; // Kenarı yuvarlak çerçeve (maske)...
  HedefBitmap : TBitmap; // Ürün Image...
  W,H,RW,RH:Integer;
  X, Y : Integer;
  sl1, sl2, sl3 : pRGBArray;  // ScanLine için sl1 Orjinal, sl2 Maske, sl3 ürün...
begin
  Bitmap      := TBitmap.Create;
  MaskeBitmap := TBitmap.Create;
  HedefBitmap := TBitmap.Create;

  Bitmap.Assign( Image.Picture.Graphic );
  MaskeBitmap.TransparentColor := clTransp;
  HedefBitmap.TransparentColor := clTransp;

  MaskeBitmap.Width  := Bitmap.Width;
  MaskeBitmap.Height := Bitmap.Height;

  HedefBitmap.Width  := Bitmap.Width;
  HedefBitmap.Height := Bitmap.Height;

  // Oval altyapı hazırlıyoruz....
  With MaskeBitmap, MaskeBitmap.Canvas do
  begin
    Pen.Color   :=clRed;
    Brush.Color :=clTransp;
    FillRect(ClipRect);

    RW := Width-1;
    RH := Height-1;
    W  := Width *R Div 200;
    H  := Height*R Div 200;

    Arc(0,0,2*W,2*H,W,0,0,H+1);
    MoveTo(W,0);
    LineTo(RW-W,0);

    Arc(RW,0,RW-2*W,2*H,RW,H,RW-W-1,0);
    MoveTo(RW,H);
    LineTo(RW,RH-H);

    Arc(RW,RH-2*H,RW-2*W,RH,RW-W,RH,RW,RH-H-1);
    MoveTo(W,RH);
    LineTo(RW-W,RH);

    Arc(0,RH,2*W,RH-2*H,0,RH-H,W+2,RH);
    MoveTo(0,H);
    LineTo(0,RH-H);

    Brush.Color := clWhite;
    FloodFill(RW Div 2, RH Div 2,clRed, fsBorder);
  end;

  // İşleme başlıyoruz...
  Bitmap.PixelFormat      := pf24Bit;
  MaskeBitmap.PixelFormat := pf24Bit;
  HedefBitmap.PixelFormat := pf24Bit;
  for y := 0 to MaskeBitmap.Height-1 do begin
    sl1 := MaskeBitmap.ScanLine[ y ]; // maskenin satırını okuduk...
    sl2 := Bitmap.ScanLine[ y ];      // kaynak/referans bitmap satırını okuduk...
    sl3 := HedefBitmap.ScanLine[ y ]; // üzerinde oynama yapılacak satırı aldık...
    for x := 0 to MaskeBitmap.Width - 1 do begin
      if sl1[x].rgbtRed = 255 then
      begin
        sl3[x].rgbtRed   := sl2[x].rgbtRed;
        sl3[x].rgbtGreen := sl2[x].rgbtGreen;
        sl3[x].rgbtBlue  := sl2[x].rgbtBlue;
      end else
      begin
        sl3[x].rgbtRed   := sl1[x].rgbtRed;
        sl3[x].rgbtGreen := sl1[x].rgbtGreen;
        sl3[x].rgbtBlue  := sl1[x].rgbtBlue;
      end;
    end;
  end;
  Image.Picture.Bitmap.Assign(HedefBitmap);
  Image.Transparent := True;
  Bitmap.Free;
  MaskeBitmap.Free;
  HedefBitmap.Free;
end;
kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  OvalYap( Image1, 30 );
end;
Dosya ekleri
ImageRoundedRect.rar
Oval Image Projesi
(220.51 KiB) 89 kere indirildi
Resim
Resim ....Resim
alren
Üye
Mesajlar: 4
Kayıt: 26 Nis 2011 08:57

Re: jpeg oval kenar verme

Mesaj gönderen alren »

ovalleştirmeden sonra fotoğrafı Kaydettiğimizde köşedeki kırpılan kısımlar siyah geliyor o kısımları beyaz yapma imkanımız varmı?
Cevapla