Matematiği iyi olan bir arkadaş yardım edebilirmi resmin en boy oranını hesaplama

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Arkadaşlar programımda bir hesaplamaya ihtiyacım var programımda OpenFileDialog1 kullanarak bir resim seçiyorum ve bu resim en=116 boy=136 oranına boyutlandırılmış olarak program klasörüne kaydediliyor ama en boy oranı korunmadan, ben ise en boy oranını koruyarak en=116 boy=136 ölçülerinin içine sığacak şekilde boyutlandırılmasını istiyorum aşağıdaki kodlarda
Dim x As Int32 = 116 'oluşturulacak resmin genişliği ne olacaksa bu değer yazılır
Dim y As Int32 = 136 'oluşturulacak resmin boyu ne olacaksa bu değer yazılır
bu kodlardaki değerler değişecek sadece hepsi bu ama matematiğim çok kötü hesabı yapamadım gitti seçtiğim resmin ölçülerini alttaki kod ile elde ediyorum
Dim en As Integer = bm.Width 'Seçtiğim resmin genişlik ölçüsünü veriyor
Dim boy As Integer = bm.Height 'Seçtiğim resmin boy ölçüsünü veriyor
İŞTE BU SEÇİLEN RESMİ en=116 boy=136 ÖLÇÜLERİNE SIĞDIRACAK EN BOY DEĞERLERİNİ NASIL ELDE EDERİM (UNUTMAYALIM EN BOY ORANI KORUNACAK)

Kod:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Masaüstü As String
        Masaüstü = CreateObject("WScript.Shell").Specialfolders("Desktop")
        OpenFileDialog1.Title = "Dosya Ekle"
        OpenFileDialog1.FileName = ""
        OpenFileDialog1.Filter = "All Files|*.*|Bitmap Files (*)|*.bmp;*.gif;*.jpg"
        OpenFileDialog1.InitialDirectory = Masaüstü
        OpenFileDialog1.AddExtension = True
        If OpenFileDialog1.ShowDialog = DialogResult.OK Then
            Dim dsyadi As String = IO.Path.GetFileName(OpenFileDialog1.FileName)
            Dim dosyaKonumu As String
            dosyaKonumu = OpenFileDialog1.FileName()
            PictureBox2.Image = Image.FromFile(OpenFileDialog1.FileName)
            '  MsgBox(OpenFileDialog1.FileName)
        End If





        'BURASI RESİM BOYUTLANDIRMA KODUDUR

        Dim bm As New Bitmap(OpenFileDialog1.FileName)
        Dim en As Integer = bm.Width 'Seçtiğim resmin genişlik ölçüsünü veriyor
        Dim boy As Integer = bm.Height 'Seçtiğim resmin boy ölçüsünü veriyor


        Dim x As Int32 = 116 'oluşturulacak resmin genişliği ne olacaksa bu değer yazılır
        Dim y As Int32 = 136 'oluşturulacak resmin boyu ne olacaksa bu değer yazılır

        Dim width As Integer = Val(x) 'image eni

        Dim height As Integer = Val(y) 'image boyu yani yüksekliği

        Dim thumb As New Bitmap(width, height)

        Dim g As Graphics = Graphics.FromImage(thumb)

        g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic

        g.DrawImage(bm, New Rectangle(0, 0, width, height), New Rectangle(0, 0, bm.Width, _
bm.Height), GraphicsUnit.Pixel)

        g.Dispose()


        'Resmin oluşturulacağı konum, dosya adı ve formatı burda belirlenir
        thumb.Save("" & Application.StartupPath & "\YeniResim.jpeg", _
System.Drawing.Imaging.ImageFormat.Jpeg) 'Resim jpeg formatında oluşturulacak

        bm.Dispose()

        thumb.Dispose()

        '     Me.Close()  'exit app
    End Sub
End Class
 

erenberk

Rektör
Katılım
10 Mayıs 2010
Mesajlar
10,637
Reaksiyon puanı
101
Puanları
228
Bir şeyi netleştirmek için yazıyorum. Mesela yapmak istediğin şey eni : 200, boyu:300 olan bir resme çevirmek olsun. Eğer sen eni 300, boyu 450 (yani 1.5 katı gibi mesela) resim verirsen bunu oran bozulmadan istediğin değere yani 200*300 e çevirebilirsin ama resmin eni 400, boyu 400 ise bunun enini 200 boyunu 300 yapmak istersen en boy oranı tabi bozulacak, bu kaçınılmaz. Bahsettiğin şey ikinci durumsa öyle bir şey mümkün değil ama ilk durumsa en/boy oranının aynı olduğu resim seçmelisin yoksa olmaz.
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
bunun her zaman olması biraz imkansız gibi. yani olur ama görüntü bozulur.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Galiba anlatamamışım istediğim şey elimde bir resim var diyelim en=150 boy=200 bu resmin en=116 boy=136 ölçüsüne getirmek değil içine sığdırmak istiyorum yani şöyle boy enden büyük ise yeni boyu 136 olacak eni ise oranı bozulmadan kaç olursa olsun işte onun değerinide bulmak lazımki koda bu değeri ekleyebileyim eğer en boydan büyük ise bu durumda en 116 olacak boy orantılanınca ne olursa olsun önemli değil YANİ ELİMDEKİ RESMİ EN BOY ORANI KORUNARAK İSTEDİĞİM ÖLÇÜLERİN İÇİNE SIĞDIRMAK İSTİYORUM (HANGİSİ DAHA UZUNSA EN YADA BOY SADECE ONUN BOYU DEĞİŞECEK DİĞER KENARIN BOYU İSE ORANTILANACAK)
KODU YAZARKEN en=150 boy=200 LÜK BİR RESMİN HANGİ KENARI UZUN ONU BULMAK LAZIM, BURDA BOY UZUN O ZAMAN BOYU 136 OLACAK PEKİ RESMİN ORANTISI KORUNUNCA ENİ NE OLACAK İŞTE FORMÜL BU! YOK ELİMİDEKİ RESMİN ENİ UZUNSA OZAMAN ENİ 116 OLACAK PEKİ RESİM ORANI KORUNUNCA BOYU NE OLACAK ASLINDA KODU YAZMAK ÇOK BASİT SADECE HESABI YAPAMIYORUM
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
basit orantı çalış :) yirmi dakikada ne yapacağını bulursun :)
 

Jaex

Asistan
Katılım
2 Ocak 2010
Mesajlar
112
Reaksiyon puanı
13
Puanları
18
ZScreen/ZUploader için yazdığım 2 farklı resize functionu vardı:

http://code.google.com/p/zscreen/source/browse/trunk/ZSS.HelpersLib/CaptureHelpers.cs
Line 223: public static Bitmap ResizeImage(Image img, Rectangle rect, bool allowEnlarge = false, bool centerImage = true)

http://code.google.com/p/zscreen/source/browse/trunk/GraphicsManagerLib/GraphicsMgr.cs
Line 520: public static Image ChangeImageSize(Image img, int width, int height, bool preserveSize = false, bool autoScale = false)

istediğin şeyi yapabiliyor olması lazım bu functionlar.
 

qazxcv

Öğrenci
Katılım
30 Kasım 2010
Mesajlar
73
Reaksiyon puanı
0
Puanları
0
programlama bilmiyorum ama matematiksel anlatabilirim.
korunacak değer(en=150 boy=200) en/boy=oran=0.75

girilen değer en1=116 boy1=136 en1/boy1=oran1 olsun (oran1=0.8529)

eğer oran1>oran ise
boy1 * oran=en2

eğer x<oran ise
en1/oran=boy2

burada en2 ve boy2 sonuç oluyor
ama bu denklemler matematiksel denklemler.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Klex arkadaşımızın kodlarını inceledim resim boyutlandırma kodu var ama değer girmek gerekiyor birde kodlar içinde % oranına göre boyutlandırma var ama buda işimi görmez
qazxcv arkadaşımızın hesabını inceledim güzel geldi işe yarıyacak gibi ama hafta içi bilgisayar başında fazla vakit geçiremediğimden çok fazla deneyemiyorum onun yöntemini denedim kafam çok karıştı ama olacak gibi görünüyor daha iyi birşey bulamazsam haftasonu onun hesabını tekrar deniycem ama aklıma çok basit ve iyi bir yöntem geldi ama döngüler konusunda biraz zayıfım bir bakarmısınız
Mesela bir döngü yapalım resmin en ve boy değerinden hep 1 eksiltsin ama ikisindende oran bozulmasın diye eşit eksiltecek ve her eksiltmede çerçeve eni ve boyu ile karşılaştırılsın çıkan değer çerçeve eni ve boyu ile eşit yada küçükmü diye taki çerçeve eni ve boyuna eşit yada küçük olana kadar eksiltme yapsın çerçeve eni ve boyuna eşit yada küçük olduğundada bana o andaki resmin en ve boyunu versin çok basit bir yol olarak bu aklıma geldi böyle bir döngü yapabilirmisiniz acaba ? böylece çerçevenin içine sığacak resim boyutunu bulmuş oluruz,ancak virgüllü rakamlar çıkma ihtimali varsa en fazla eksi onluk yada eksi yüzlük değerleri versin gerisini vermesin bana
 

seckintat

Öğrenci
Katılım
21 Mart 2008
Mesajlar
67
Reaksiyon puanı
0
Puanları
0
arkadaşım oranı 102*136 yaparsan resim bozulmadan boyutlandırmış olursun :) matematikten pek anlamam ama bence bu şekilde yaparsan olacak :)
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Döngülerde çok acemiyim ama işimi yapabiliyorum aşağıdaki kodu yazdım yaptığım testlerde bir sorun görünmüyor resim istediğim çerçeve içerisine girecek(Taşmadan) boyutlarda yeniden ölçülendiriliyor. döngüm epey acemice ama çalışıyor bir problemle fazla büyük resimlerde yada yatık resimlerde tam anlayamadım i = i + 1 değerde taşma oluyor acaba bu döngüyü elden geçirebilirmisiniz? taşma olmadan, Boyutlandırılacak resmin hem eninden hem boyundan 1 eksiltsin taki çerçevenin en küçük kenarı olan eninin değerine kadar yani 116 'ya kadar
Kod:
        ' Ben testimi kolaylaştırmak için boyutunu değiştireceğim resmi
        ' PictureBox1 içine attım ve burdan kullandım
        Dim resimboy As Integer = Me.PictureBox1.Image.Height
        Dim resimen As Integer = Me.PictureBox1.Image.Width

        Dim i As Byte
        Dim deger As Integer ' bu oluşturulacak resmin eni (yani boyutu küçültülünce değer buna atanacak)
        Dim deger2 As Integer ' bu oluşturulacak resmin boyu(yani boyutu küçültülünce değer buna atanacak)
        Do
            i = i + 1 ' burda i'nin değeri hep 1 arttırılıyor 1 2 3 4 5 6 gibi devam ediyor

            deger = resimen - i
            deger2 = resimboy - i

        Loop Until deger = 116

:hammer:
 

sithlord

Öğrenci
Katılım
6 Ekim 2011
Mesajlar
38
Reaksiyon puanı
1
Puanları
0
Arkadaslar sorun cok basit neden bu kadar karistirilmis anlamadim. Bu sorun dingulerle cozulebilir ama kotu programlama tekniklerine ornek olabilir o zaman. Diyeliki 1000x1000 lik resmi 100x100 yapacaksin, 900 kere dongunun donmesi lazim. Onun yerine sunu yapabilirsin.

Hedef boyut x*y
Girilen Boyut A*B olsun

Herzaman buyuk olan kenara gore orantilama yapilir.
if(A>B) {
yeni_x = x;
yeni_y = B*x/A;
} else {
yeni_x = A*y/B;
yeni_y = y;
}
 

Mert Ahmet

Dekan
Katılım
16 Mayıs 2010
Mesajlar
5,706
Reaksiyon puanı
41
Puanları
228
Photoshopta çok daha kolay bir şekilde bu boyutlandırma yapılabilir.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Arkadaslar sorun cok basit neden bu kadar karistirilmis anlamadim. Bu sorun dingulerle cozulebilir ama kotu programlama tekniklerine ornek olabilir o zaman. Diyeliki 1000x1000 lik resmi 100x100 yapacaksin, 900 kere dongunun donmesi lazim. Onun yerine sunu yapabilirsin.

Hedef boyut x*y
Girilen Boyut A*B olsun

Herzaman buyuk olan kenara gore orantilama yapilir.
if(A>B) {
yeni_x = x;
yeni_y = B*x/A;
} else {
yeni_x = A*y/B;
yeni_y = y;
}

BU KOD ÇOK İYİ İŞE YARADI SÜPER
Kod:
 Dim SeçilenResim As Image = Image.FromFile(Me.OpenFileDialog1.FileName)
            Dim hedefyükseklik As Integer = Me.PictureBox2.Height
            Dim hedefgenişlik As Integer = Me.PictureBox2.Width
            Dim resminyüksekliği As Integer = SeçilenResim.Height
            Dim resmingenişliği As Integer = SeçilenResim.Width

' *************************************************************
            Dim yeni_x, yeni_y As Integer ' Yeni ölçü değerleri bu iki integer'e atanıyor
' *************************************************************
            If resminyüksekliği <= hedefyükseklik And resmingenişliği <= hedefgenişlik Then
                yeni_x = resminyüksekliği
                yeni_y = resmingenişliği
            Else
                If resminyüksekliği > resmingenişliği Then
                    yeni_x = hedefyükseklik
                    yeni_y = resmingenişliği * hedefyükseklik / resminyüksekliği
                Else
                    yeni_x = resminyüksekliği * hedefgenişlik / resmingenişliği
                    yeni_y = hedefgenişlik
                End If
            End If
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Evet ona benzer ordaki kodlarda orana göre boyutlandırma var bende onun gibi çözmüştüm sorunu ama doğrudan hesaplama yöntemi daha kısa kodla daha pratik ve hızlı oldu
 
Üst