AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Verlustfreies Zoomen von Bildern (Interpolieren)
Thema durchsuchen
Ansicht
Themen-Optionen

Verlustfreies Zoomen von Bildern (Interpolieren)

Ein Thema von Stanlay Hanks · begonnen am 18. Okt 2003 · letzter Beitrag vom 20. Okt 2003
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#11

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 09:23
Ich hab mich jetzt mal mit Scanline befasst (Is ja gar nicht so schwer, wie ich gedacht hatte ). Naja ich denke mal, mit Scanline sollte das schon wesentlich schneller gehen. Mein hauptproblem is aber nun, dass ich ja, mit der Methode, die ich angewendet habe, das Original Bild ja nur doppelt so groß machen kann, aber keine freie neue Größe bestimmen kann. Hat da wer ne Idee, wie ich das machen könnte? (Nicht böse sein, wenn ich nicht gleich zurückschreibe, ich bin heute nicht den ganzen Tag zu Hause )

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 10:12
Du kennt doch strechdraw oder?

Btw: http://www.irfanview.com/ damit kann leicht bilder vergrössern
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#13

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 10:48
@Gandalfus
StrechDraw ist zwar einfach zu nutzen und vergrössert auch.
Glättet aber nicht, sonderen zeichnet nur die Pixel mehrfach.

Und wenn die Vergrösserung unglücklich gewählt ist (z.B. 150%), sieht es echt bescheuert aus.


Add:
Delphi-Quellcode:
QI = QuellImage
ZI = ZielImage
Variablen = Integerr
...I[X, Y] = entspricht einem Farbwert des Pixels (z.B. Rot)

For X = 0 to ZI.Width - 1 do
  For Y = 0 to ZI.Height - 1 do Begin
    X2 = Trunc(QI.Width * (X / ZI.Width));
    Y2 = Trunc(QI.Height * (Y / ZI.Height));
    PX = Frac(QI.Width * (X / ZI.Width));
    PY = Frac(QI.Height * (Y / ZI.Height)));
    ZI[X, Y] = QI[X2, Y2] * (1 - PX) * (1 - PY) +
               QI[X2 + 1, Y2] * PX * (1 - PY) +
               QI[X2, Y2 + 1] * (1 - PX) * PY +
               QI[X2 + 1, Y2 + 1] * PX * PY;
  End;
Ich hoffe, du verstehst was ich meine. Hab es möglichts einfach gehalten.
Soll nur das Prinzip für eine Vergrösserung mit linearen Übergängen darstellen.
Angehängte Dateien
Dateityp: exe project1_807.exe (375,5 KB, 49x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 10:59
Das Problem dabei ist nur, dass Stan ja immer jeden zweiten Pixel interpoliert hat, und wenn er einen beliebigen Vergrößerungsfaktor nimmt, hat er diese Regelmäßigkeit nicht mehr.
Ich würde dabei allerdings folgendes vorschlagen:
Wie bereits erwähnt erstmal das Bild mit Stretchdrwa vergrößern. Dann musst du herausfinden wieviele Pixel dazugekommen sind, also die (für die Breite) Width der neuen Bitmap minus die Width der alten. Da man die neuen Pixel ja gleichmäßig auf das Bild verteilen muss, muss man die neue Breite durch die Anzahl der neuen Pixel teilen.
Ein Beispiel:
Du hast 20 Pixel, stechst sie auf 25. Es gibt also 5 neue Pixel. 25/5=5, es müsste also jeder fünfte Pixel interpoliert werden. Gibts nur noch das Problem, dass der letzter zu interpolierende Pixel auch der letzte des Bildes ist, man also keinen zweiten Vergleichspixel hat. Naja, da kann man sich aushelfen indem man für den letzten Pixel einfach dieselben Werte nimmt wie für den vorletzten.
Ich bin mir nicht sicher ob das immer funktioniert, aber n Denkanstoß ist das doch bestimmt...

Bis dann,

S - tefano
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#15

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 12:34
Wenn es nicht unter Windows 95 laufen muss, kannst du für sowas auch prima die GDI+ nehmen, die bei Windows XP dabei ist und die es als Redistributable für Windows 98/Me und NT4/2000 gibt. Eine entsprechende Delphi-Unit ist auch schnell gefunden. Die GDI+ unterstützt Alphablending, Antialiasing, "weiche" Skalierung (also das was du willst), und damit sparst du dir eine Menge Code.

Wenn du es dennoch von Hand machen willst, hier ein Tipp:
Wenn du z.B. 20 auf 25 Pixel vergrößern willst, dann musst du diese 20 Pixel GLEICHMÄSSIG auf die 25 verteilen, also auch mit Nachkommastellen. Dann kannst du nämlich für jeden Pixel (besser: Jedes Pixelzentrum) zwischen den beiden links und rechts davon gelegenen Pixeln deine lineare Interpolation durchführen.

Zum Beispiel vier auf fünf Pixel:
Code:
Das sind die originalen vier Pixel(-zentren):
1) X----X----X----X
Das sind die vier Pixel, verteilt auf die Länge von fünf Pixeln:
2) X------X------X------X
Und jetzt musst du für diese Stellen die lineare Interpolation berechnen:
3) X----X----X----X-----X
Verstehste?
Der zweite Pixel von links liegt etwa auf dreiviertel der Strecke der "originalen gestreckten" Pixel, also wird er 1/4 mal der linke Pixel und 3/4 mal der rechte Pixel usw.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#16

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 19. Okt 2003, 17:36
Hallo! Entschuldigt bitte die späte Antwort, aber ich bin grade erst nach Hause gekommen.

Erstmal vielen Dank für die vielen Anregungen und Erklährungen
StrechDraw, muss ich gestehen, kannte ich vorher noch nicht...Ich hab immer versucht, das mit der Strech Eigenschaft des Images zu machen Aber das hat nicht hingehauen.
S-Tefano hat mein Problem genau erkannt. Mir fehlt diese Regelmäßigkeit. Aber eure Ideen sind echt gut und werde die jetzt auch gleich mal alle genau durchdenken und ausprobieren.
@OregonGhost Was du genau meinst, habe ich leider nicht genau verstanden Ich meine das, was du über "Komma Stellen" gesagt hast. Ich meine, es gibt doch keine kleinere Einheit mehr, als ein Pixel, oder? (aber wahrscheinlich hab ich da was falsch verstanden...

Um deine Prozedur zu verstehen, himitsu, muss ich mir erstmal noch diese "Trun und Frac" Sachen in der OI anschauen. Aber das wird sich bestimmt schnell klähren. Auf jeden Fall schon mal danke an alle! Ich werd mich wieder melden, wenn ich das ganze a) fertig habe oder b) noch probleme habe.

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#17

Und ich kapiers immer noch nicht :(

  Alt 20. Okt 2003, 08:29
Hallo. Ja...ich bins schon wieder
Ich hab gerade versucht, das Beispiel von S-tefano in Delphi zu verwirklichen. Und weil ich sehen wollte, ob das auch mit "außergewöhnlichen" Vergrößerungsfaktoren (also nicht nur 2x, 3x, 4x) geht, hab ich ein 98 x 98 großes Bidl (das DP Logo ) genommen und es mit Strechdraw auf 200 Pixel Größe zeichnen lassen. Jetzt hab ich ein wenig gerechnet: Das "Gestretchte" Bild ist um 102 Pixel größer als das Original. Demzufolge müsste ich jetzt doch jetzt jedes 1,96078431372549. Pixel interpolieren. Aber wie geht das? Ich meine, ich kann doch nicht "zwischen den Pixeln" zeichnen oder interpolieren. (Mein Gedankengang ist der, dass man ein Pixel doch in Integerwerten angeben muss und nicht in Fließkommawerten). Kann mir da wer auf die Sprünge helfen? (Tut mir ehrlich leid, wenn ich jetzt schon langsam nerve, aber ich verstehs nicht richtig )

Danke, Stanlay
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#18

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 20. Okt 2003, 09:13
Wenn du dir mal mein Beispiel anschaust wirst du merken, das hier nicht nur die Zwischenpixel, sondern auch die "Hauptpixel" (wie sie hier überall genannt wurden), an Hand der 4 nächstliegensten Pixel und entsprechend ihres Abstands interpoliert werden.

Wenn zum Beispiel bei einer regelmäßigen Struktur Pixel (Zeilen/Spalten) eingefügt werden und sich die "Hauptpixel" nicht ändern, kann es unschön ausseh'n.


S-tefano meinte das z.B. so:
Delphi-Quellcode:
Org: --------------------
Zoom: ----i---i---i---i---i----

i = werden interpoliert
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#19

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 20. Okt 2003, 09:23
Hallo. Du meinst also, ich soll das ganze Bild interpolieren? Also zum Beispiel:

Code:
Gestretchtes Bild:
xxxxxxxxxxxxxxxxxxxx
1. Schleifendurchgang:
xixxxxxxxxxxxxxxxxxx
2. Schleifendurchgang:
xxixxxxxxxxxxxxxxxxx
Hast du das so gemeint?

Was S-Tefano gemeint hat, hab ich schon verstanden, nur es ist halt manchmal so, dass es rein rechnerisch nötig wäre, nicht jeder 4,5 oder 6. Pixel zu interpolieren, sondern zum Beispiel jedes 1,237582. Pixel. verstehst du, was ich meine

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#20

Re: Verlustfreies Zoomen von Bildern (Interpolieren)

  Alt 20. Okt 2003, 09:36
Das Beispiel sucht für jedes Pixel einzeln die 4 Pixel, welche dieses überlagern, und berechnet daraus einen entsprechenden Wert.
Delphi-Quellcode:
1 2 | 1 2
    I | I
               | 3 4
               |
               | z.B.: 1*25% + 2*25% + 3*25% + 4*25%
3 4 |
               |
z.B.: 1*50% + 2*23% + 3*17% + 4*10%
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz