Entwickler-Ecke

Multimedia / Grafik - StretchBlt HALFTONE zeichnet weich bevor es skaliert?


shana-chan - Sa 10.03.18 01:22
Titel: StretchBlt HALFTONE zeichnet weich bevor es skaliert?
Ich habe Schwierigkeiten ein Bild hoch zu skalieren.

Ich versuche dafür StretchBlt mit HALFTONE zu verwenden.

Das Das Eingangsbild ist 8x8 Pixel groß. und die Ausgabe sieht aus als währe sie immer noch 8x8 Pixel groß aber wurde trotzdem teilweise weich gezeichnet. (siehe Bild)
user defined image


Hier mein Code:

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:
24:
25:
26:
27:
28:
29:
procedure TForm1.FormCreate(Sender: TObject);
begin
  image1.Picture.Bitmap.Height:=8;
  image1.Picture.Bitmap.Width:=8;
  image2.Picture.Bitmap.Height:=image2.Height;
  image2.Picture.Bitmap.Width:=image2.Width;
  //image1.Picture.Bitmap.PixelFormat:=pf32Bit;
  //image2.Picture.Bitmap.PixelFormat:=pf32Bit;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:integer;
begin

  image1.Picture.Bitmap.Canvas.Pixels[random(8),random(8)]:=RGB(255,0,0);
  image1.Picture.Bitmap.Canvas.Pixels[random(8),random(8)]:=RGB(255,255,255);

  SetStretchBltMode(image2.Picture.Bitmap.Canvas.Handle,HALFTONE);
  //SetStretchBltMode(image2.Picture.Bitmap.Canvas.Handle,COLORONCOLOR);
  //Caption:=inttostr(GetStretchBltMode(image2.Picture.Bitmap.Canvas.Handle));
  //SetBrushOrgEx(image2.Picture.Bitmap.Canvas.Handle,0,0,nil);
  StretchBlt(image2.Picture.Bitmap.Canvas.Handle,0,0,image2.Picture.Bitmap.Width,image2.Picture.Bitmap.Height,
             image1.Picture.Bitmap.Canvas.Handle,0,0,image1.Picture.Bitmap.Width,image1.Picture.Bitmap.Height,SRCCOPY);

  for i:=0 to image1.Height do image1.Picture.Bitmap.Canvas.Pixels[i,i]:=RGB(0,255,0);
  for i:=0 to image2.Height do image2.Picture.Bitmap.Canvas.Pixels[i,i]:=RGB(0,0,255);

end;


Mach ich irgendwas Falsch?


Symbroson - Sa 10.03.18 10:48

Warum so kompliziert? StrechDraw funktioniert bei mir genauso gut / besser:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:integer;
begin
  timer1.Enabled := false;

  //zufälliges Bild aus roten pixeln generieren
  for i:=0 to image1.Height do begin
    image1.Picture.Bitmap.Canvas.Pixels[random(8),random(8)] := $ff;
    image1.Picture.Bitmap.Canvas.Pixels[random(8),random(8)] := $ff;
  end;

  image2.Canvas.StretchDraw(Rect(00, image2.Width, image2.Height), image1.Picture.Bitmap);

  //diagonalen
  for i:=0 to image1.Height do image1.Picture.Bitmap.Canvas.Pixels[i,i] := $ff00;
  for i:=0 to image2.Height do image2.Picture.Bitmap.Canvas.Pixels[i,i] := $ff0000;
end;


shana-chan - So 11.03.18 03:01

Ich hatte vergessen zu erwähnen dass das Bild weichgezeichnet werden soll. Und nicht einfach nur die Pixel vergrößert werden sollen. Ich stelle mir das so vor wie in diesem Bild: (mit externem Tool bearbeitet)
sbhttstz1m

Deswegen so kompliziert mit StretchBlt und HALFTONE.

EDIT: Ich denke ich habe falsch verstanden wie StretchBlt/HALFTONE funktioniert. Das scheint nur für das verkleinern von Bildern geeignet zu sein. Zum vergrößern muss man sich wohl selbst was ausdenken.


Delete - So 11.03.18 07:33

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - So 11.03.18 10:14

Den Effekt den du suchst heißt übrigens Antialiasing
Vllt findest du hier etwas hilfreiches:
https://stackoverflow.com/questions/3613130/simple-anti-aliasing-function-for-delphi-7