Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Image als Tbyte umwandeln (https://www.delphipraxis.net/200693-image-als-tbyte-umwandeln.html)

zeina 16. Mai 2019 12:06

Image als Tbyte umwandeln
 
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;

Neutral General 16. Mai 2019 12:11

AW: Image als Tbyte umwandeln
 
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.

zeina 16. Mai 2019 12:17

AW: Image als Tbyte umwandeln
 
Zitat:

Zitat von Neutral General (Beitrag 1432330)
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 ???

TiGü 16. Mai 2019 12:26

AW: Image als Tbyte umwandeln
 
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.

Neutral General 16. Mai 2019 12:27

AW: Image als Tbyte umwandeln
 
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 :?: :glaskugel:
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.

Klaus01 16. Mai 2019 12:29

AW: Image als Tbyte umwandeln
 
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

zeina 16. Mai 2019 12:37

AW: Image als Tbyte umwandeln
 
Zitat:

Zitat von Neutral General (Beitrag 1432335)
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 :?: :glaskugel:
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:
Delphi-Quellcode:
laImage := GetBlob(lpTblGraph);
ich bearbeite an das Bild ,und dann wechsle ich mit (Button Klick)neues Bild mit Orginales Bild

zeina 16. Mai 2019 12:38

AW: Image als Tbyte umwandeln
 
Zitat:

Zitat von Klaus01 (Beitrag 1432336)
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;

Klaus01 16. Mai 2019 13:23

AW: Image als Tbyte umwandeln
 
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

zeina 17. Mai 2019 11:22

AW: Image als Tbyte umwandeln
 
das funktioniert nicht.Das Bild ist nicht geändert.

gibt es eine Methode,mit der kann ich ein Foto Als TBayte in TmemoryStream abspeicheren


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.
Seite 1 von 2  1 2      

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