AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap "auf die harte Tour" schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap "auf die harte Tour" schreiben

Ein Thema von alcaeus · begonnen am 28. Feb 2006 · letzter Beitrag vom 13. Mär 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#21

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 17:04
Moin moin,

also das Erstellen, Schreiben der Bits und Speichern funktioniert schon ganz gut, allerdings stolpere ich ueber den Fehler in GetPixelFromBitmap(). Matti, hast du dafuer schon eine Loesung oder soll ich mich da mal ransetzen?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#22

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 20:32
Jaja, da hab ich nicht richtig nachgedacht. Da steckt ein Fehler drinn.

Nutze die von Muetze1, die passt einfach genial.

Delphi-Quellcode:
function GetPixelFromMonoBitmap(bmp: TBitmap; x, y: Integer): TDigits;
var
  lPixel: pByte;
  lBit: Integer;
begin
  lPixel := bmp.Scanline[y]; // Pixelline holen
  Inc(lPixel, x div 8); // welches Byte

  lBit := x mod 8; // in welchem Byte ist der Bit der das Pixel ist
  
  // ist Pixel (0 oder 1) und Bit im Byte > 1 dann Pixel gesetzt (1)
  If ( lPixel^ and ( 1 shl (7 - lBit))) > 0 Then Result := 1
    // ist Pixel (0 oder 1) und Bit im Byte < 1 dann Pixel nicht gesetzt (0)
    Else Result := 0;
end;
Kommentiert, hoffentlich richtig.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#23

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 20:41
effektiver ist es einfach mit scanline einen Pointer auf die letzte Zeile einmalig zu holen und dann damit weiter zu arbeiten. Es ist völlig überflissig sich mit scanline jedesmal die Zeile zu holen, denn hinter der letzten zeile folgt die vorletzte etc.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#24

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 20:43
Mach mal vor ?! (wie ist das gemeint, für Dummis)

Äh, du meinst immer eine Zeile komplett zu bearbeiten, also wo sich Scanline gerade befindet ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#25

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 21:10
es ist einfach ineffektiv bei jedem aufruf Scanline erneut zu nutzen. Es reicht wenn man ein einziges mal scanline benutzt und sich den Rückgabewert merkt. Anschließend kann man von diesem Wert ausgehend auf die anderen Bytes zugreifen.
Ich meinte nicht immer eine Zeile komplett zu bearbeiten. Ich meinte wirklich nur einmal scanline zu nutzen.

Zur Veranschauligung hier mal meine Unit die ich für schnelle Zugriffe nutze:
Delphi-Quellcode:
interface

uses
  windows, graphics;

type
  TBmpFast = class(TObject)
  private
    fFirstLine: Pointer;
    fHeight : Cardinal;
    fLineSize: Cardinal;
    fWidth : Cardinal;
  public
    constructor Create;

    property Height: Cardinal read fHeight;

    function GetByte(X, Y: Word): PByte;
    function GetRGBTriple(X, Y: Word): PRGBTriple;
    function GetRGBQuad(X, Y: Word): PRGBQuad;
    procedure Init(ABmp: TBitmap; ABitsPerPixel: Byte);
  end;


implementation

constructor TBmpFast.Create;
begin
  inherited Create;
  fFirstLine := nil;
  fLineSize := 0;
end;

function TBmpFast.GetByte(X, Y: Word): PByte;
begin
  result := PByte(Cardinal(fFirstLine) - (fLineSize * Y) + X);
end;

function TBmpFast.GetRGBTriple(X, Y: Word): PRGBTriple;
begin
  result := PRGBTriple(Cardinal(fFirstLine) - (fLineSize * Y) + (X * 3));
end;

function TBmpFast.GetRGBQuad(X, Y: Word): PRGBQuad;
begin
  result := PRGBQuad(Cardinal(fFirstLine) - (fLineSize * Y) + (X * 4));
end;

procedure TBmpFast.Init(ABmp: TBitmap; ABitsPerPixel: Byte);
begin
  fHeight := ABmp.Height;
  fWidth := ABmp.Width;
  fFirstLine := ABmp.ScanLine[0];
  fLineSize := BytesPerScanline(fWidth, ABitsPerPixel, 32);
end;

end.
Ich rufe einfach die Init-methode auf un darin wird ein mal Scanline aufgerufen. Die zugriffe auf das Pixel X,Y erfolgen anschließend mit Berechnungen der Werte die bei Init ermittelt wurden. Also ohne erneutes Aufrufen von Scanline. Und somit mehr performance weil nicht jedes mal das ausgeführt wird was in der Scanlinefunktion eben so von statten geht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 08: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