[Lazarus] copy from Topenglcontext
Andrea Mauri
andrea.mauri.75 at gmail.com
Wed Jun 18 14:51:09 CEST 2014
Dear Corpsman,
I slightly modified your routine since I noticed that the copied image was
copied as in a mirror (I don't know hot to exlpain it better).
I modified the line:
TempIntfImg.Colors[i, j] := CurColor;
in
TempIntfImg.Colors[i, result.height - 1 - j] := CurColor;
2014-06-17 16:12 GMT+02:00 Andrea Mauri <andrea.mauri.75 at gmail.com>:
> Many thanks.It works as expected.
> Il 15/giu/2014 10:08 "Corpsman" <corpsman at web.de> ha scritto:
>
> My Version uses glReadPixels, result is TBitmap, this can easily be
>> atteched to the cliboard.
>>
>> Function OpenGLScreenshot: TBitmap;
>> Var
>> dim: Array[0..3] Of Integer;
>> c: Array Of Array[0..3] Of Byte;
>> z, i, j: integer;
>> TempIntfImg: TLazIntfImage;
>> ImgHandle, ImgMaskHandle: HBitmap;
>> CurColor: TFPColor;
>> Begin
>> // Auslesen der Framebuffer Auflösung
>> glGetIntegerv(GL_VIEWPORT, @dim[0]);
>> // Erstellen des Bitmaps
>> result := TBitmap.create;
>> result.pixelformat := pf24bit;
>> result.width := dim[2];
>> result.height := dim[3];
>> TempIntfImg := TLazIntfImage.Create(0, 0);
>> TempIntfImg.LoadFromBitmap(result.Handle, result.MaskHandle);
>> setlength(c, dim[2] * dim[3]);
>> // Auslesen des Framebuffers in einen temporären Speicher
>> glReadPixels(dim[0], dim[1], dim[2], dim[3], GL_RGBA, GL_UNSIGNED_BYTE,
>> @c[0, 0]);
>> // Umschreiben des Temporären Speichers in das TBitmap
>> z := 0;
>> For j := 0 To result.height - 1 Do
>> For i := 0 To result.width - 1 Do Begin
>> CurColor.red := c[z][0] * 256;
>> CurColor.green := c[z][1] * 256;
>> CurColor.blue := c[z][2] * 256;
>> // c[z][3] wäre der Alphakanal, aber den Braucht man ja hier nicht
>> ...
>> TempIntfImg.Colors[i, j] := CurColor;
>> inc(z);
>> End;
>> TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
>> result.Handle := ImgHandle;
>> result.MaskHandle := ImgMaskHandle;
>> TempIntfImg.free;
>> End;
>>
>>
>> On 06/14/2014 12:13 PM, Michalis Kamburelis wrote:
>>
>>> Andrea Mauri wrote:
>>>
>>>> Dear all,
>>>>
>>>> Is it possible to copy the content of OpenGLContext to the clipboard?
>>>> How can be done?
>>>>
>>>> You could also copy the contents of OpenGL context (created by
>>> TOpenGLContext or any other similar control) using glReadPixels, and
>>> then convert the resulting bytes into a TBitmap instance. Then you can
>>> copy TBitmap contents to clipboard like Anton shows, using
>>> Clipboard.Assign (see
>>> http://wiki.lazarus.freepascal.org/Clipboard#Load_from_clipboard ).
>>>
>>> Using glReadPixels and then converting the result will be
>>> cross-platform, as opposed to Anton's solution using
>>> Windows.CreateCompatibleBitmap .
>>>
>>> Michalis
>>>
>>>
>>> --
>>> _______________________________________________
>>> Lazarus mailing list
>>> Lazarus at lists.lazarus.freepascal.org
>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>>>
>>>
>>
>> --
>>
>> Auf meiner Homepage www.Corpsman.de ist immer was los, ständig wird sie
>> aktualisiert und erweitert. Da ist für jeden was dabei.
>>
>>
>> --
>> _______________________________________________
>> Lazarus mailing list
>> Lazarus at lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20140618/edae40ac/attachment-0003.html>
More information about the Lazarus
mailing list