Newsgroup: it.comp.lang.delphi
Titolo: Convertire da RGB a Bitmap ...

Salve ...
Devo convertire una immagine RGB in Bitmap. L'esempio che mi è stato fornito
in Visual Basic funziona perfettamente. L'equivalente (forse) in Delphi mi
restituisce una
immagine con strisce nere in fondo e l'immagine stessa è sdoppiata al suo
interno.
una vera schifezza.
La funzioncina da me scritta è ( il tipo CspRgbImage è quello fornito dalla
video camera mediante il metodo Getimage):
function TMainFrm.RGBToBMP(Frame: CspRgbImage): TBitmap;
var
  InfoHeader: TBitmapInfoHeader;
  FileHeader: TBitmapFileHeader;
  S: TMemoryStream;
  FrameBitmap:PSafeArray;
  Bitmap: TBitmap;
begin
with InfoHeader do
        begin
        biSize := 40;
        biPlanes := 1;
        biBitCount := 24;
        biCompression := 0;
        biSizeImage := 0;
        biXPelsPerMeter := 0;
        biYPelsPerMeter := 0;
        biClrUsed := 0;
        biClrImportant := 0;
        biWidth := Frame.Width;
        biHeight := Frame.Height;
        biSizeImage := 3 * biWidth * biHeight;
        end;
with FileHeader do
        begin
        bfType := $4D42;
        bfOffBits := 12 + InfoHeader.biSize;
        bfSize := FileHeader.bfOffBits + InfoHeader.biSizeImage;
        bfReserved1 := 0;
        bfReserved2 := 0;
        end;
S := TMemoryStream.Create;
S.Write(FileHeader, SizeOf(FileHeader));
S.Write(InfoHeader, SizeOf(InfoHeader));
FrameBitmap:=Frame.Bitmap;
S.Write(FrameBitmap, InfoHeader.biSizeImage);
S.Position := 0;
Bitmap := TBitmap.Create;
Bitmap.LoadFromStream(S);
S.Free;
Result:=Bitmap;
end;
Posto anche l'equvalente Basic:
Private Sub btnSaveBmp_Click()
    Dim image As CspRgbImage
        Set image = CspCamView1.GetBitmap()
    Dim infoheader As BITMAPINFOHEADER
        infoheader.biSize = 40
        infoheader.biPlanes = 1
        infoheader.biBitCount = 24
        infoheader.biCompression = 0
        infoheader.biSizeImage = 0
        infoheader.biXPelsPerMeter = 0
        infoheader.biYPelsPerMeter = 0
        infoheader.biClrUsed = 0
        infoheader.biClrImportant = 0
        infoheader.biWidth = image.Width
        infoheader.biHeight = image.Height
        infoheader.biSizeImage = 3 * infoheader.biWidth *
infoheader.biHeight
    Dim fileheader As BITMAPFILEHEADER
        fileheader.bfType = &H4D42
        fileheader.bfOffBits = 12 + infoheader.biSize
        fileheader.bfSize = fileheader.bfOffBits + infoheader.biSizeImage
        fileheader.bfReserved1 = 0
        fileheader.bfReserved2 = 0
    On Error GoTo FileError
    Open edtBmpFile.Text For Binary As #10
    Put #10, , fileheader
    Put #10, , infoheader
    Put #10, , image.Bitmap
    Close #10
    Set image = Nothing
Exit Sub
FileError:
    MsgBox "Write Bitmap file" & edtBmpFile.Text & "Error"
    Set image = Nothing
End Sub
Domanda: cosa sbaglio ? Sono in fase di esaurimento, inoltre ho cercato
molto anche sul web ma non ne sono venuto a capo ... Forse il problema non è
banale.
Grazie a tutti

io proverei prima di tutto a cambiare la funzione passando come parametro
anche il tbitmap da restituire:
 function TMainFrm.RGBToBMP(Frame: CspRgbImage; ABitmap: TBitmap): integer;
 var
   InfoHeader: TBitmapInfoHeader;
   FileHeader: TBitmapFileHeader;
   S: TMemoryStream;
   FrameBitmap:PSafeArray;
 begin
  Result := -1;
 with InfoHeader do
         begin
         biSize := 40;
         biPlanes := 1;
         biBitCount := 24;
         biCompression := 0;
         biSizeImage := 0;
         biXPelsPerMeter := 0;
         biYPelsPerMeter := 0;
         biClrUsed := 0;
         biClrImportant := 0;
         biWidth := Frame.Width;
         biHeight := Frame.Height;
         biSizeImage := 3 * biWidth * biHeight;
         end;
 with FileHeader do
         begin
         bfType := $4D42;
         bfOffBits := 12 + InfoHeader.biSize;
         bfSize := FileHeader.bfOffBits + InfoHeader.biSizeImage;
         bfReserved1 := 0;
         bfReserved2 := 0;
         end;
S := TMemoryStream.Create;
try
  S.Write(FileHeader, SizeOf(FileHeader));
  S.Write(InfoHeader, SizeOf(InfoHeader));
 FrameBitmap:=Frame.Bitmap;
 S.Write(FrameBitmap, InfoHeader.biSizeImage);
 S.Position := 0;
 Bitmap.LoadFromStream(S);
Result := 0;
finally
  S.Free;
 end;
Bye
A.