[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