AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Image als Tbyte umwandeln

Ein Thema von zeina · begonnen am 16. Mai 2019 · letzter Beitrag vom 17. Mai 2019
Antwort Antwort
Seite 1 von 2  1 2   
zeina

Registriert seit: 8. Jun 2018
56 Beiträge
 
#1

Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:06
Hallo,
ich habe ein Problem.
Ich habe ein Bilds aus Tmemorystream ,das ich gezeigt und gedreht habe.Ich will die gedrehetes Bild mit Orginales Bild umtauschen.
Ich versuche gedrehtes Bild in Temomerystream zu speichern und die altes löschen,aber ich könnte nicht (image1.picture.graphic)to Tbyte array wexchseln.
Delphi-Quellcode:

procedure TFormFoto.SpeichernClick(Sender: TObject);
var
lpTblFeature: TpBtrvDBTableData;
  lpTblGraph: TpBtrvDBTableData;
  lmstFoto : TMemoryStream;
  laImage : TaByte;
  lgrpImage: TGraphic;

begin
 lmstFoto:=Tmemorystream.Create;
 try
  Image1.Picture.Graphic.SaveToStream(lmstFoto);
  laImage:= GetBlob(RelData('GR'));
  lmstFoto.Position := 0;
  if lGetRecord(RelData('GR'), 1) then begin
     InitRelation('GR', false);
      PutSField('GR', 1, 'CP');
      PutIdField('GR', 2, 20);
       Searchrecord('GR', 1);
      // DeleteRecord('GR');
  end;
      PutSField('GR', 1, 'CP');
      PutIdField('GR', 2, 34);
      PutBlob ('GR',laImage);
      InsertRecord2('GR');
 finally
  lmstFoto.Free;
 end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:11
Ich verstehe nur Bahnhof. Gerade was den Code angeht, aber ich werfe einfach mal TBytesStream in den Raum.
Funktioniert wie TMemoryStream, aber hat eine Property "Bytes" die den Inhalt des Streams als Byte-Array zurückgibt.

Vielleicht hilft dir das schon.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
zeina

Registriert seit: 8. Jun 2018
56 Beiträge
 
#3

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:17
Ich verstehe nur Bahnhof. Gerade was den Code angeht, aber ich werfe einfach mal TBytesStream in den Raum.
Funktioniert wie TMemoryStream, aber hat eine Property "Bytes" die den Inhalt des Streams als Byte-Array zurückgibt.

Vielleicht hilft dir das schon.
???


ICh habe ein Bild ,das ich aus Tmemorystream geladet.
nach bestimmten BEarbeitund des Bildes,will ich diese Bild statt orginales Bild in Tmemorystream Speichern ???
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:26
Es ist ganz hilfreich, wenn die Anfragen in einen gut lesbaren Deutsch geschrieben werden.
Das hat was mit Wertschätzung zu tun und motiviert dadurch die Antwortenden, überhaupt was zu schreiben.
Solltest du Legastheniker oder kein Muttersprachler sein, nutze doch bitte zum Beispiel Microsoft Word zum Schreiben der Beiträge und die darin enthaltene Rechtschreibprüfung und Korrektur.

Leider sieht man in deinen Quelltext-Schnipsel nicht, was genau du mit dem MemoryStream machst außer zu erzeugen, das Bild reinzuladen und freizugeben.
Solltest du zum Beispiel auf einer Kopie der Daten aus dem Stream arbeiten, könntest du TMemoryStream.Clear aufrufen und per Write-Funktionen die neuen Daten zurückschreiben.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:27
Dein Code hat auch keinen Zusammenhang und 90% davon sind Funktionsaufrufe zu deinen eigenen Funktionen die hier niemand kennt.
Wenn dein bearbeitetes Bild in Image1 ist, dann tust du was du willst doch schon längst:
Delphi-Quellcode:
// Das speichert dein (bearbeitetes?) Bild in einen MemoryStream
Image1.Picture.Graphic.SaveToStream(lmstFoto);
Vielleicht stell ich mich auch nur doof an, aber ich verstehe nicht wo genau das Problem ist.
Kannst du mal genauer erklären/zeigen wo dein bearbeitetes Bild überhaupt drin ist oder evtl sogar wie du das Bild bearbeitest?

Meine weit hergeholte Vermutung ist, dass du mit Image1.Canvas versuchst das Bild zu bearbeiten
Falls das der Fall ist, dann ist das das Problem. mit Image1.Canvas malst du nicht auf das Bild, sondern auf den "Rahmen".

Wenn du das Bild selbst bearbeiten willst, brauchst du ein Bitmap.
Falls dein Bild in Image1 kein Bitmap ist, musst du es in ein TBitmap umwandeln.
Dann kannst du das Bild per Bitmap.Canvas bearbeiten und dann Bitmap.SaveToStream wieder abspeichern.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.753 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:29
How do you rotate the image?
Do you rotate it by changing the orientation tag in jpg header?
This can be done directly in the memorystream by modifying the appropriate bytes.

Best regards
Klaus
Klaus
  Mit Zitat antworten Zitat
zeina

Registriert seit: 8. Jun 2018
56 Beiträge
 
#7

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:37
Dein Code hat auch keinen Zusammenhang und 90% davon sind Funktionsaufrufe zu deinen eigenen Funktionen die hier niemand kennt.
Wenn dein bearbeitetes Bild in Image1 ist, dann tust du was du willst doch schon längst:
Delphi-Quellcode:
// Das speichert dein (bearbeitetes?) Bild in einen MemoryStream
Image1.Picture.Graphic.SaveToStream(lmstFoto);
Vielleicht stell ich mich auch nur doof an, aber ich verstehe nicht wo genau das Problem ist.
Kannst du mal genauer erklären/zeigen wo dein bearbeitetes Bild überhaupt drin ist oder evtl sogar wie du das Bild bearbeitest?

Meine weit hergeholte Vermutung ist, dass du mit Image1.Canvas versuchst das Bild zu bearbeiten
Falls das der Fall ist, dann ist das das Problem. mit Image1.Canvas malst du nicht auf das Bild, sondern auf den "Rahmen".

Wenn du das Bild selbst bearbeiten willst, brauchst du ein Bitmap.
Falls dein Bild in Image1 kein Bitmap ist, musst du es in ein TBitmap umwandeln.
Dann kannst du das Bild per Bitmap.Canvas bearbeiten und dann Bitmap.SaveToStream wieder abspeichern.


Delphi-Quellcode:
procedure TFormFoto.ZeigeFoto(DB: String; ID: TiBtrvID);
var
  lpTblGraph: TpBtrvDBTableData;
  lbmpImage: TBitmap;
  lmstImage: TMemoryStream;
  laImage : TaByte;
  lgrpImage: TGraphic;
  ljpgImage: TJPEGImage;
  lpicImage: TPictureTyp;

begin
  lbmpImage := nil;
  lmstImage := nil;
  ljpgImage := nil;
  try
    lbmpImage := TBitmap.Create;
    lmstImage := TMemoryStream.Create;

    lpTblGraph := RelData('GR');
    PutSField('GR', 1, DB);
    PutIdField('GR', 2, ID);
    if lGetRecord(lpTblGraph, 1) then
    begin
{$IFDEF TITAN}
      laImage := GetBlob(lpTblGraph);
{$ENDIF} // DEF TITAN

      lmstImage.Clear;
      lmstImage.Write(laImage[0], Length(laImage));
      lmstImage.Position := 0;
      lpicImage := PictureTyp_pruefen(lmstImage);
      case lpicImage of
        pw_JPG:
          begin
            lmstImage.Clear;
            lmstImage.Write(laImage[0], Length(laImage));
            lmstImage.Position := 0;
            ljpgImage := TJPEGImage.Create;
            ljpgImage.LoadFromStream(lmstImage);
            try
              lbmpImage.Assign(ljpgImage);
              lgrpImage.Free;
              lgrpImage := lbmpImage;
              Image1.picture.Graphic := (lgrpImage);
            finally
              ljpgImage.Free;
            end;
          end;
        pw_BMP:
          begin
            lbmpImage.Transparent := True;
            lbmpImage.LoadFromStream(lmstImage);
            lbmpImage.TransparentColor := lbmpImage.Canvas.Pixels[0,lbmpImage.Height - 1];
            lbmpImage.ReleaseMaskHandle;
            lgrpImage.Free;
            lgrpImage := lbmpImage;
            Image1.picture.Graphic := (lgrpImage);
          end;
        pw_None:
          begin
            Application.MessageBox('ungultiges Foto', 'AIDA',MB_OK or MB_ICONERROR);
          end;
      end;
      FormFoto.Caption := DB + '-' + IntToStr(ID);
      FotoResize;
    end
    else begin
      lgrpImage := nil;
    end;
  finally
    lmstImage.Free;
    lbmpImage.Free;
  end;
end;

das bild aus DatenBank gezeigt:
laImage := GetBlob(lpTblGraph); ich bearbeite an das Bild ,und dann wechsle ich mit (Button Klick)neues Bild mit Orginales Bild
  Mit Zitat antworten Zitat
zeina

Registriert seit: 8. Jun 2018
56 Beiträge
 
#8

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 12:38
How do you rotate the image?
Do you rotate it by changing the orientation tag in jpg header?
This can be done directly in the memorystream by modifying the appropriate bytes.

Best regards
Klaus
Delphi-Quellcode:
procedure TFormFoto.rotate90(const aSource: TGraphic; Bmp: TBitmap);
var
  SourceBmp : TBitmap;
  SourcePixel, DestPixel : PRGBQuad;
  Y, X, SourceWidth, SourceHeight: Integer;
begin
  SourceBmp := TBitmap.Create;
  try
    SourceBmp.PixelFormat := pf32bit;
    SourceBmp.Height := aSource.Height;
    SourceBmp.Width := aSource.Width;
    SourceBmp.Canvas.Draw(0, 0, aSource);
    SourceHeight := SourceBmp.Height;
    SourceWidth := SourceBmp.Width;

    Bmp.PixelFormat := pf32bit;
    Bmp.Height := SourceWidth;
    Bmp.Width := SourceHeight;

    for Y := 0 to SourceWidth - 1 do
    begin
      DestPixel := Bmp.ScanLine[Y];
      SourcePixel := SourceBmp.ScanLine[SourceBmp.Height - 1];
      Inc(SourcePixel, Y);

      for X := 0 to SourceHeight - 1 do
      begin
        DestPixel^ := SourcePixel^;
        Inc(SourcePixel, SourceWidth);
        Inc(DestPixel);
      end;
    end;
  finally
    SourceBmp.Free;
  end;
end;


procedure TFormFoto.Drehennach1Click(Sender: TObject);
Var
  Bmap:Tbitmap;
begin
  Bmap := TBitmap.Create;
  try
    rotate90(Image1.Picture.Graphic, Bmap);
    Image1.Picture.Assign(Bmap);
    Panel1.Width :=Bmap.Width;
    PAnel1.Height:=Bmap.Height;
    Image1.Refresh;
  finally
    Bmap.Free;
  end;
end;
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.753 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Image als Tbyte umwandeln

  Alt 16. Mai 2019, 13:23
wenn Du das gedrehte BMP als jpg speichern willst musst Du das Bitmap einer jpg Instanz zuweisen. Die TJpegImage Klasse hat auch eine Methode um in einen Stream zu schreiben.

Delphi-Quellcode:
var
  jpg: TJpegImage;
  bmp: TBitmap;
  mStream: TMemoryStream;
begin
  try
    jpg := TJpegImage.Create;
    try
      bmp := TBitmap.Create;
      try
        // do something with bmp

        jpg.Assign(bmp);
        jpg.SaveToStream(mStream);
      finally
        bmp.Free;
      end;
    finally
      jpg.Free;
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
PS: ich weiß das der Memorystream nicht instantiiert ist.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
zeina

Registriert seit: 8. Jun 2018
56 Beiträge
 
#10

AW: Image als Tbyte umwandeln

  Alt 17. Mai 2019, 11:22
das funktioniert nicht.Das Bild ist nicht geändert.

gibt es eine Methode,mit der kann ich ein Foto Als TBayte in TmemoryStream abspeicheren
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:39 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