Autor Beitrag
ABCDE
Hält's aus hier
Beiträge: 2

Win XP
Delphi 7 Pro
BeitragVerfasst: Di 11.04.06 22:47 
Hi ihr Leutz

Ich hab da mal eine Frage!
Ich vergrößere mein Bitmap mit dieser Funktion,
aber trotzdem ist ein Fehler da!

Bitte helft mir!!!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  c, d: Integer;
begin
  if not OpenDialog1.Execute then
    Exit;
  if not FileExists(OpenDialog1.Filename) then
    Exit;
  Image1.Picture.LoadFromFile(OpenDialog1.FileName);
  PB.Max := Image1.Picture.Height * Image1.Picture.Width;
  PB.Step := 1;
 for d:=0 to 1024 do
  begin
    for c := 0 to 768 do
      begin
          Image2.Canvas.Brush.Color := Image1.Canvas.Pixels[c, d];
          Image2.Canvas.Rectangle(c*2, d *2, c * 4,  d * 4);
          PB.StepIt;
      end;
    end;
end;
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 12.04.06 00:07 
Moin und :welcome: im Forum!

user profile iconABCDE hat folgendes geschrieben:
Ich vergrößere mein Bitmap mit dieser Funktion,
aber trotzdem ist ein Fehler da!

Ach, das lieben wir doch; wieder was zum Raten... :gruebel: :roll: ;) tja, aber leider...

Glaskugel hat folgendes geschrieben:
Parameterfehler: Bitte die Eingabe mit mehr Details wiederholen.


cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 12.04.06 00:33 
Nimm am besten gleich Canvas.StretchDraw, das dürfte auch performanter als diese "Technik" sein.

ausblenden Delphi-Quelltext
1:
Image2.Canvas.Rectangle(c*2, d *2, c * 4,  d * 4);					


Hmm, also wenn ich richtig tippe, willst du das Bild auf 2x Breite und Höhe skalieren. "Richtiger" wäre hier dann eher

ausblenden Delphi-Quelltext
1:
Image2.Canvas.Rectangle(c*2, d*2, c*2+1, d*2+1);					


oder was für Special-Effects möchtest du haben?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 12.04.06 08:08 
Na, der Fehler liegt eher hier:
Deine Laufvariablen gehen von 0..768 und 0..1024 und greifen als Indizes auf deine Bitmap zu. Die ist aber u.U. viel kleiner.
Richtig geht es so (Pseudocode, also bitte keine Syntaxfehler oder fehlenden Deklarationen bemäkeln, das soll so sein):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Procedure SlowStretch (aBitmap : TBitmap; aDestRect : TRect; aDestCanvas : TCanvas);
Begin
  w := (aDestRect.Right - aDestRect.Left) / aBitmap.Width; // Breite des Zielpixels.
  h := (aDestRect.Bottom - aDestRect.Top) / aBitmap.Height; // Höhe des Zielpixels
  For i:=0 To aBitmap.Width - 1 do
    For j:=0 to aBitmap.Height - 1 do 
       With aDestCanvas Do Begin
         Brush.Color := aBitmap.Pixel[j,i];
         x := Scale (i, aBitmap.Width, aDestRect.Left, aDestRect.Right); // Zielkoordinaten berechnen
         y := Scale (j, aBitmap.Height, aDestRect.Top , aDestRect.Bottom);
         Rectangle (x, y, w, h)
      End
End;

Function Scale (aSrc, aSrcSize, aLeft, aRight : Number) : Number;
// Rechnet den Wert aSrc (0..aSrcSize-1) in einen proportional äquivalenten Wert im Bereich aLeft..aRight um
// aSrc =0 ==> Result = aLeft
// aSrc = aSrcSize ==> Result = aRight
// aSrc = aSrcSize/2 ==> Result = aLeft + (aRight - aLeft)/2
// ...
Begin
  Result := aLeft + aSrc*(aRight-aLeft)/aSrcSize;
End;

Leider funktioniert das nicht ohne Weiteres, weil die Dimension und Position des Zielpixels als gebrochen rationale Zahl berechnet wird, aber eine ganze Zahl sein muss. Daraus folgt, das die einzelnen Zielpixel i.A. nicht alle gleich aussehen. Daher ist ein Verzerren eines Bitmaps nicht trivial.

Du willst aber offensichtlich die Bitmaps nur doppelt so groß ausgeben. Dann müsstest Du das Zielrechteck nur doppelt so groß wählen, wie das Bitmap.

Die richtige Vorgehensweise ist jedoch, mit einem TImage zu Arbeiten und seine 'Streched' Eigenschaft zu verwenden. Auf den Canvas malt man eine Bitmap vergrößert wie Spaceguide bereits beschrieben hat.

_________________
Na denn, dann. Bis dann, denn.