Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitmap aus Array (https://www.delphipraxis.net/71612-bitmap-aus-array.html)

fLaSh11 18. Jun 2006 14:47


Bitmap aus Array
 
Hallo,

In meinem
Delphi-Quellcode:
Array[1..50,1..50]of Byte
stehten Nullen und Einsen.
Wie kann ich nun aus meinem Array eine Bitmap erstellen.

-Wenn im Array eine 1 steht, soll das gleichnamige Pixel(z.B. [1,12]) grau werden.
-Wenn im Array eine 2 steht, soll das Pixel schwarz werden.
-Die Bitmap soll, wie das Array 50x50 (oder variabel, wie das Array) groß sein.

Also ich dachte mir, dass man mit einer for-Schleife kommt und innen dass für die Farben mit if-Schleifen. Aber ich hab keine Ahnung, wie man Pixel in einer Bitmap erstellt^^.

P.S.: Die Forensuche ergab nichts dergleichen o.O

Luckie 18. Jun 2006 14:52

Re: Bitmap aus Array
 
Wenn ich mich nicht irre, besitzt TBitmap die Methode SetPixel.

semo 18. Jun 2006 15:02

Re: Bitmap aus Array
 
*arrrggghhhh*
Zitat:

if-schleifen
:roll:

sowas gibt es nicht... :wink:

Yahibanez 18. Jun 2006 15:05

Re: Bitmap aus Array
 
kannst es mit nem temporären TImage versuchen.

Delphi-Quellcode:
Image1.Canvas.Pixels[pos_x,pos_y] := $00202020;
kannst dann ja die arrays in nen Hex-Code umwandeln, alle 3 Plätze gleichmachen und schon haste nen Grauton.
pos_x & pos_y kannste auch vom array abhängig machen

Flo85 18. Jun 2006 17:42

Re: Bitmap aus Array
 
Zitat:

Zitat von fLaSh11
Hallo,

In meinem
Delphi-Quellcode:
Array[1..50,1..50]of Byte
stehten Nullen und Einsen.
-Wenn im Array eine 1 steht, soll das gleichnamige Pixel(z.B. [1,12]) grau werden.
-Wenn im Array eine 2 steht, soll das Pixel schwarz werden.

wenn du nur grau und schwartz hast kanste doch Boolean nehmen
Delphi-Quellcode:
Array[1..50,1..50]of boolean

DGL-luke 18. Jun 2006 17:57

Re: Bitmap aus Array
 
Delphi-Quellcode:
type
  TGrayArray = array of array of Byte;

function MakeGray(values: TGrayArray): TBitMap;
var x,y:Integer;
begin
  Result := TBitmap.create;              //erzeugen
  Result.Width := length(values);
  Result.height := length(values[0]);
  Result.Canvas.Brush.Color := clblack;
  Result.canvas.Rectangle(0,0,Result.Width,Result.Height); //schwarz färben

  for x := 0 to high(values) do
    for y := 0 to high(values[x]) do
      if y < Result.Width then
        begin
          Result.Pixels[x,y] := rgb(values[x,y],values[x,y],values[x,y]); //sehr langsam! scanline/GR32 ist besser!
        end
      else
        Break; //wir wollen nicht über die bitmapgrenzen hinaus malen
end;
Nicht getestet.

turboPASCAL 18. Jun 2006 19:36

Re: Bitmap aus Array
 
Übrigens, warum ein Array erstellen wenn man schon ein Bitmap hat ?
Dieses kann doch auch das Bitmap übernehmen ... nur mal so nebenbei.

DGL-luke 18. Jun 2006 19:46

Re: Bitmap aus Array
 
Ausgangssituation war "habe Array", nicht "habe Bitmap". :gruebel:

EDIT: hier nochmal mit scanline, man will ja nicht kleinlich sein:

Delphi-Quellcode:
type
  TGrayArray = array of array of Byte;

function MakeGray(values: TGrayArray): TBitMap;
var x,y:Integer;
    row: Pointer;
begin
  Result := TBitmap.create;              //erzeugen
  Result.Width := length(values);
  Result.height := length(values[0]);
  Result.Canvas.Brush.Color := clblack;
  Result.canvas.Rectangle(0,0,Result.Width,Result.Height); //schwarz färben

  for y := 0 to high(values[0]) do
    begin
      row := Result.ScanLine[y];
      for x := 0 to high(values) do
       if (y < Result.Width) and (x < Result.Height) then
          TColor(Pointer(Integer(row)+x)^) := rgb(values[x,y],values[x,y],values[x,y]);
    end;
end;
kompiliert, nicht getestet.

Khabarakh 18. Jun 2006 20:11

Re: Bitmap aus Array
 
Wenn du es schon schnell haben willst, würde ich die if-Abfrage aus der Schleife rausnehmen und noch RGB ersetzen ;) .
Btw: Es ging nicht um Byte-Werte, sondern (0, 1, 2). Wenn ein So-Gut-Wie-Weiß reicht:
Delphi-Quellcode:
// values[i] sei für alle i gleichlang

function MakeGray(values: TGrayArray): TBitMap;
var
  x, y: Integer;
  ptr: PCardinal; // 32bit
begin
  Result := TBitmap.create;
  Result.Width := length(values);
  Result.height := length(values[0]);
 
  for y := 0 to high(values[0]) do
    begin
      ptr := Result.ScanLine[y];
      for x := 0 to high(values) do
      begin
          ptr^ := $7F7F7F * values[x, y];
          Inc(ptr);
      end;
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz