Autor Beitrag
shana-chan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Sa 10.03.18 00:22 
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:
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:
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?
Einloggen, um Attachments anzusehen!
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Sa 10.03.18 09:48 
Warum so kompliziert? StrechDraw funktioniert bei mir genauso gut / besser:

ausblenden 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;

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
shana-chan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 11.03.18 02: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.
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 11.03.18 06:33 
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
function DrawStretched(CanvasIn, CanvasOut: TCanvas; ARect: TRect;
  DrawBlurred: Boolean = false): Boolean;
var
  r: TRect;
  mode: Integer;
begin
  r := CanvasIn.ClipRect;
  if DrawBlurred then
    mode := HALFTONE else
    mode := 0;
  SetStretchBltMode(CanvasOut.Handle, mode);
  StretchBlt(CanvasOut.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom,
             CanvasIn.Handle, 00, r.Right, r.Bottom, SRCCOPY);
end;

// Demo
procedure TForm1.Button1Click(Sender: TObject);
const
  BMP_PX_SIZE = 8;
var
  before, after: TBitmap;
  i: Integer;
begin
  before := TBitmap.Create;
  try
    after := TBitmap.Create;
    try
      // VORHER ( 8x8 Pixel )
      before.Width := BMP_PX_SIZE;
      before.Height := BMP_PX_SIZE;

      for i := 0 to BMP_PX_SIZE - 1 do
      begin
        before.Canvas.Pixels[random(BMP_PX_SIZE), random(BMP_PX_SIZE)] := clRed;
        before.Canvas.Pixels[random(BMP_PX_SIZE),random(BMP_PX_SIZE)] := clWhite;
        before.Canvas.Pixels[i, i] := clGreen;
      end;
      self.Canvas.Draw(2020, before);

      // NACHHER  ( 160x160 Pixel )
      after.Width := BMP_PX_SIZE * 20;
      after.Height := BMP_PX_SIZE * 20;

      // nur vergrößert
      DrawStretched(before.Canvas, after.Canvas, Rect(00, BMP_PX_SIZE * 20, BMP_PX_SIZE * 20));
      self.Canvas.Draw(5020, after);

      // vergrößert und weicher
      DrawStretched(before.Canvas, after.Canvas, Rect(00, BMP_PX_SIZE * 20, BMP_PX_SIZE * 20), true);
      self.Canvas.Draw(23020, after);
    finally
      after.Free;
    end;
  finally
    before.Free;
  end;
end;

delphi_draw_blurred

Die Funktion SetStretchBltMode() sorgt mit dem Wert HALFTONE schon dafür, dass die Grafik danach "ein wenig weicher" erschreint.
Ich könnte mir vorstellen, wenn du meine DrawStretched() Methode ein paar mal hintereinander aufrufst, und dabei den CanvasIn mit dem CanvasOut überschreibst, dass die ausgegebene Grafik immer weicher wird.
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: So 11.03.18 09:14 
Den Effekt den du suchst heißt übrigens Antialiasing
Vllt findest du hier etwas hilfreiches:
stackoverflow.com/qu...unction-for-delphi-7

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)