Autor Beitrag
xDavidx
Hält's aus hier
Beiträge: 5

Win NT 4.0, Win 98, Win ME, Win XP, Win Vista, Win 7
Delphi 2005 Personal
BeitragVerfasst: Fr 31.07.09 02:47 
Hallo,

ich bin neu hier und möchte mal das ganze Forum grüßen.

Jetzt zu meinem Problem ich hab da einen Codeausschnitt in C
und hätte den gerne in Delphi übersetzt bekommen. Versuche es schon
länger aber bekomme es nicht hin ohne C kenntnisse.

Danke im Vorraus.

Hier der Code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
       TCHAR *FileNames[] = {
                                TEXT("PIC10.BMP"),
                                TEXT("LION.BMP"),
                                TEXT("PIC6.BMP"),
                                NULL
                             };

        int index = 0;
        while(1)
        {
            TCHAR* pFileName = FileNames[index];
            if( pFileName == NULL ) break;
            printf("Test Graphic %sn",pFileName);


            HBITMAP hbmp  = NULL;
            HDC     hdc =   NULL;
            do
            {
                hbmp = (HBITMAP)LoadImage(NULL,pFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                if( hbmp == INVALID_HANDLE_VALUE ) break;

                HDC hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
                if (hdc == NULL) break;

                BITMAPINFO BMPInfo;
                memset(&BMPInfo,0,sizeof(BMPInfo));
                BMPInfo.bmiHeader.biSize = sizeof(BMPInfo);

                int r = GetDIBits(hdc,hbmp,0,0,NULL,&BMPInfo,DIB_RGB_COLORS);
                if( r == 0 ) break;

                printf(" biSize      %d/%dn",BMPInfo.bmiHeader.biSize,sizeof(BMPInfo));
                printf(" biSizeImage %dn",BMPInfo.bmiHeader.biSizeImage);
                printf(" biWidth     %dn",BMPInfo.bmiHeader.biWidth);
                printf(" biHeight    %dn",BMPInfo.bmiHeader.biHeight);
                printf(" biBitCount  %dn",BMPInfo.bmiHeader.biBitCount);
                printf(" biPlanes    %dn",BMPInfo.bmiHeader.biPlanes);
                printf(" biClrUsed   %dn",BMPInfo.bmiHeader.biClrUsed);

                if( BMPInfo.bmiHeader.biPlanes != 1 ) break;
                if( BMPInfo.bmiHeader.biHeight != 64 ) break;
                if( BMPInfo.bmiHeader.biWidth  != 128 ) break;
                if(     BMPInfo.bmiHeader.biBitCount != 1 
                    &&  BMPInfo.bmiHeader.biBitCount != 24
                    &&  BMPInfo.bmiHeader.biBitCount != 32 ) break;

                int BMPInfoSize = sizeof(BITMAPINFOHEADER);
                if( BMPInfo.bmiHeader.biCompression == BI_BITFIELDS ) BMPInfoSize += 12;
                else BMPInfoSize += BMPInfo.bmiHeader.biClrUsed * sizeof(RGBQUAD);

                BITMAPINFO* pBMPInfo = (BITMAPINFO*) ( new BYTE[BMPInfoSize] ); 
                if( pBMPInfo != NULL )
                {
                    *pBMPInfo = BMPInfo;
                }

                BYTE* pBuffer = new BYTE[BMPInfo.bmiHeader.biSizeImage];
                if( pBuffer != NULL )
                {
                    memset(pBuffer,0,BMPInfo.bmiHeader.biSizeImage);
                    r = GetDIBits(hdc,hbmp,0,64,pBuffer,pBMPInfo,DIB_RGB_COLORS);
                    printf( " GetDIBits %dn",r);
                    PSUC_Frame2LCD(handle,pBuffer,BMPInfo.bmiHeader.biSizeImage);
                }
            }
            while(0);
            if( hbmp != NULL ) CloseHandle(hbmp);
            if( hdc != NULL ) CloseHandle(hdc);

            index += 1;
            Sleep(5000);
        }
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 31.07.09 09:07 
Hallo und :welcome: hier im Forum!

Es wäre sinnvoll, wenn du einmal deinen Versuch posten würdest, das zu korrigieren geht schneller als es komplett zu übersetzen.

Aber die Frage ist eher: Was möchtest du denn damit machen? Ich meine einfach so ein übersetzter Codefetzen bringt ja nicht viel, wenn das dann nicht in den Delphicode passt, das ist ja keine komplette Funktion oder so...
Und vielleicht geht das in Delphi auch einfacher.

Auf den ersten Blick sieht der Code so aus als ob damit Bilder aus einem Array mit Dateinamen ausgelesen und auf einem LCD (PSUC_Frame2LCD) angezeigt werden? Wie ist PSUC_Frame2LCD denn deklariert?
xDavidx Threadstarter
Hält's aus hier
Beiträge: 5

Win NT 4.0, Win 98, Win ME, Win XP, Win Vista, Win 7
Delphi 2005 Personal
BeitragVerfasst: Fr 31.07.09 13:38 
Ich habe leider mein Versuch nicht mehr.

Ja genau die Funktion PSUC_Frame2LCD stammt aus einer Dll und soll
ein Bild an ein LCD schicken.

Ich Poste mal den kompletten Code und die header Datei.

Ich möchte eigentlich nur wissen wie ich da das Bild hinschicken kann.
Die anderen Funktionen funktionieren schon.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
 // PsucApiTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <psucapi.h>

int _tmain(int argc, _TCHAR* argv[])
{
    PSUC_HANDLE handle = PSUC_Open();
    if( handle != NULL )
    {
        PSUC_InitLCD(handle);
        Sleep(1000);
        printf("Test Textausgabe 1\n");
        PSUC_Text2LCD(handle,TEXT("Test 1"));
#if 1

        Sleep(2000);
        printf("Test Textausgabe 2 (ANSI), Background color\n");
        PSUC_Text2LCD(handle,TEXT("Test 1"));
        PSUC_SetBackgroundColor(handle,255,255,0);
        PSUC_Text2LCDA(handle,"Test 2 äöüßÄÖÜ");
        Sleep(2000);
        printf("Test Textausgabe 3 (UNICODE), Foreground color\n");
        PSUC_SetForegroundColor(handle,0,0,0);
        PSUC_Text2LCDW(handle,L"Test 3 äöüßÄÖÜ");
        Sleep(2000);

        PSUC_SetForegroundColor(handle,0,255,0);
        PSUC_SetBackgroundColor(handle,0,0,0);

        printf("Test Textausgabe Raw Zeichen code 0 - 127\n");

        BYTE    CharSet[256];
        for(int i = 0; i < sizeof(CharSet); i += 1 ) CharSet[i] = BYTE(i);
        PSUC_Text2LCDRaw(handle,CharSet,128);

        Sleep(5000);
        printf("Test Textausgabe Raw Zeichen code 128 - 255\n");

        PSUC_Text2LCDRaw(handle,&CharSet[128],128);

        Sleep(5000);


        printf("Test Invert\n");

        for(int i = 0; i < 10; i += 1)
        {
            PSUC_SetMode(handle,1); // Invers
            Sleep(250);
            PSUC_SetMode(handle,0);
            Sleep(250);
        }

        printf("Test Boot graphic\n");

        PSUC_ShowBootGraphic(handle);

        printf("Test Brightness\n");

        for(int j = 0; j < 5; j += 1 )
        {
            for(int i = 255; i >= 0 ; i -= 5 )
            {
                PSUC_SetBrightness(handle,BYTE(i));
                Sleep(50);
            }

            for(int i = 0; i <= 255; i += 5 )
            {
                PSUC_SetBrightness(handle,BYTE(i));
                Sleep(50);
            }
        }
#endif
        Sleep(1000);
        TCHAR *FileNames[] = {
                                TEXT("PIC10.BMP"),
                                TEXT("LION.BMP"),
                                TEXT("PIC6.BMP"),
                                NULL
                             };

        int index = 0;
        while(1)
        {
            TCHAR* pFileName = FileNames[index];
            if( pFileName == NULL ) break;
            printf("Test Graphic %s\n",pFileName);


            HBITMAP hbmp  = NULL;
            HDC     hdc =   NULL;
            do
            {
                hbmp = (HBITMAP)LoadImage(NULL,pFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                if( hbmp == INVALID_HANDLE_VALUE ) break;

                HDC hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
                if (hdc == NULL) break;

                BITMAPINFO BMPInfo;
                memset(&BMPInfo,0,sizeof(BMPInfo));
                BMPInfo.bmiHeader.biSize = sizeof(BMPInfo);

                int r = GetDIBits(hdc,hbmp,0,0,NULL,&BMPInfo,DIB_RGB_COLORS);
                if( r == 0 ) break;

                printf(" biSize      %d/%d\n",BMPInfo.bmiHeader.biSize,sizeof(BMPInfo));
                printf(" biSizeImage %d\n",BMPInfo.bmiHeader.biSizeImage);
                printf(" biWidth     %d\n",BMPInfo.bmiHeader.biWidth);
                printf(" biHeight    %d\n",BMPInfo.bmiHeader.biHeight);
                printf(" biBitCount  %d\n",BMPInfo.bmiHeader.biBitCount);
                printf(" biPlanes    %d\n",BMPInfo.bmiHeader.biPlanes);
                printf(" biClrUsed   %d\n",BMPInfo.bmiHeader.biClrUsed);

                if( BMPInfo.bmiHeader.biPlanes != 1 ) break;
                if( BMPInfo.bmiHeader.biHeight != 64 ) break;
                if( BMPInfo.bmiHeader.biWidth  != 128 ) break;
                if(     BMPInfo.bmiHeader.biBitCount != 1 
                    &&  BMPInfo.bmiHeader.biBitCount != 24
                    &&  BMPInfo.bmiHeader.biBitCount != 32 ) break;

                int BMPInfoSize = sizeof(BITMAPINFOHEADER);
                if( BMPInfo.bmiHeader.biCompression == BI_BITFIELDS ) BMPInfoSize += 12;
                else BMPInfoSize += BMPInfo.bmiHeader.biClrUsed * sizeof(RGBQUAD);

                BITMAPINFO* pBMPInfo = (BITMAPINFO*) ( new BYTE[BMPInfoSize] ); 
                if( pBMPInfo != NULL )
                {
                    *pBMPInfo = BMPInfo;
                }

                BYTE* pBuffer = new BYTE[BMPInfo.bmiHeader.biSizeImage];
                if( pBuffer != NULL )
                {
                    memset(pBuffer,0,BMPInfo.bmiHeader.biSizeImage);
                    r = GetDIBits(hdc,hbmp,0,64,pBuffer,pBMPInfo,DIB_RGB_COLORS);
                    printf( " GetDIBits %d\n",r);
                    PSUC_Frame2LCD(handle,pBuffer,BMPInfo.bmiHeader.biSizeImage);
                }
            }
            while(0);
            if( hbmp != NULL ) CloseHandle(hbmp);
            if( hdc != NULL ) CloseHandle(hdc);

            index += 1;
            Sleep(5000);
        }

        PSUC_SetForegroundColor(handle,255,0,0);
        PSUC_SetBackgroundColor(handle,32,32,64);

        // Note: Current version of Display limits y coordinate to multiple of 8
        //       (Will be rounded down)
        PSUC_PrintA(handle,3,2*8,"End");

        PSUC_Close(handle);
    }
  return 0;
}

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
#ifndef __PSUCAPI_H__
#define __PSUCAPI_H__


#ifdef __cplusplus
extern "C" {
#endif

#ifdef PSUCAPI_EXPORTS
#define PSUCAPI_API __declspec(dllexport) __stdcall
#else
#define PSUCAPI_API __declspec(dllimport) __stdcall
#endif

typedef ULONG_PTR   PSUC_HANDLE;

extern PSUC_HANDLE PSUCAPI_API PSUC_Open(void);
extern void PSUCAPI_API PSUC_Close(PSUC_HANDLE psucHandle);
           
extern int PSUCAPI_API PSUC_GetAdcVal(PSUC_HANDLE psucHandle);
extern int PSUCAPI_API PSUC_SetDacVal(PSUC_HANDLE psucHandle,SHORT siVal);
           
extern int PSUCAPI_API PSUC_Frame2LCD(PSUC_HANDLE psucHandle,BYTE* pBuffer,int BufferSize);
extern int PSUCAPI_API PSUC_Command(PSUC_HANDLE psucHandle,BYTE Command, BYTE param1, BYTE param2, BYTE param3);
extern int PSUCAPI_API PSUC_ReadData(PSUC_HANDLE psucHandle,BYTE* pBuffer,int BufferSize);
           
extern int PSUCAPI_API PSUC_Text2LCDW(PSUC_HANDLE psucHandle,WCHAR* pText);
extern int PSUCAPI_API PSUC_Text2LCDA(PSUC_HANDLE psucHandle,CHAR* pText);
extern int PSUCAPI_API PSUC_Text2LCDRaw(PSUC_HANDLE psucHandle,BYTE* pText,int Length);

extern int PSUCAPI_API PSUC_PrintW(PSUC_HANDLE psucHandle,int x,int y,WCHAR* pText);
extern int PSUCAPI_API PSUC_PrintA(PSUC_HANDLE psucHandle,int x,int y,CHAR* pText);
extern int PSUCAPI_API PSUC_PrintRaw(PSUC_HANDLE psucHandle,int x,int y,BYTE* pText,int Length);

extern int PSUCAPI_API PSUC_WriteOutputReport(PSUC_HANDLE psucHandle,short iReportNr, short command, short usAdress, short btSize, BYTE* pBuffer);

extern int PSUCAPI_API PSUC_InitLCD(PSUC_HANDLE psucHandle);
extern int PSUCAPI_API PSUC_ClearLCD(PSUC_HANDLE psucHandle);
extern int PSUCAPI_API PSUC_ShowBootGraphic(PSUC_HANDLE psucHandle);
extern int PSUCAPI_API PSUC_SetMode(PSUC_HANDLE psucHandle,BOOL bInvers);

extern int PSUCAPI_API PSUC_SetForegroundColor(PSUC_HANDLE psucHandle,BYTE red,BYTE green,BYTE blue);
extern int PSUCAPI_API PSUC_SetBackgroundColor(PSUC_HANDLE psucHandle,BYTE red,BYTE green,BYTE blue);
extern int PSUCAPI_API PSUC_SetBrightness(PSUC_HANDLE psucHandle,BYTE value);


#ifdef UNICODE
#define PSUC_Text2LCD PSUC_Text2LCDW
#else
#define PSUC_Text2LCD PSUC_Text2LCDA
#endif

#ifdef __cplusplus
}
#endif

#endif
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 31.07.09 14:00 
TBitmap instantiieren, deine Grafik mit LoadFromFile laden und den Puffer via Scanline übergeben. Im Grunde nix anderes macht der C-Source. Die anderen PArameter bin ich grad zu faul rauszusuchen, wie die zu Stande kommen, dürften aber direkt aus dem TBitmap auslesbar sein.

In dem Puffer stehen die Pixel-Informationen Bildpunkt für Bildpunkt (Zeilenweise) drin. Zwecks Bildaufbau bottom-up (BMP default) oder top-down (intuitiv) müsstest du schauen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
xDavidx Threadstarter
Hält's aus hier
Beiträge: 5

Win NT 4.0, Win 98, Win ME, Win XP, Win Vista, Win 7
Delphi 2005 Personal
BeitragVerfasst: Fr 31.07.09 14:31 
So sieht meine Funktion bis jetzt aus funktioniert aber leider nicht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
Procedure Frame2LCD (Bitmap:tBitmap);
var PSUC_Frame2LCD: TPSUC_Frame2LCD;
    PSUC_Open: TPSUC_Open;
    Handle: THandle;
    Psuc_Handle: THandle;
    BMPInfo: TBitmapinfo;
    pBuffer: pByte;
    i: integer;
begin
  Handle:=LoadLibrary('PsucApi.dll');
  if Handle <> 0 then begin
    @PSUC_Open := GetProcAddress(Handle, '_PSUC_Open@0');
    if @PSUC_Open <> nil then begin
      Psuc_Handle:=PSUC_Open();
      @PSUC_Frame2LCD := GetProcAddress(Handle, '_PSUC_Frame2LCD@12');
      if @PSUC_Frame2LCD <> nil then begin
      for i:=0 to Bitmap.Height-1 do
      PBuffer:=bitmap.Scanline[i];
      PSUC_Frame2LCD(Psuc_Handle, pBuffer, sizeof(pBuffer) );
      end;
    end;
    FreeLibrary(Handle);
  end;
end;


Was ist da falsch es kommt keine Fehlermeldung. Es kommt nur kein Bild am LCD an.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 31.07.09 14:33 
Der möchte als Puffergröße nicht die Größe des Zeigers (4 Byte) haben, sondern die Länge der Daten (Width * BytePerPixel), und dann auch nicht je Zeile, sondern das gesamte Bild in einem einzigen Puffer.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
xDavidx Threadstarter
Hält's aus hier
Beiträge: 5

Win NT 4.0, Win 98, Win ME, Win XP, Win Vista, Win 7
Delphi 2005 Personal
BeitragVerfasst: Fr 31.07.09 14:39 
Und wie bekomme ich das hin?
Ich hab keine Ahnung wie ich das machen soll.
xDavidx Threadstarter
Hält's aus hier
Beiträge: 5

Win NT 4.0, Win 98, Win ME, Win XP, Win Vista, Win 7
Delphi 2005 Personal
BeitragVerfasst: So 02.08.09 10:57 
Ok ich habe eine Lösung gefunden.
Danke.
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: So 02.08.09 10:58 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
type
  ULONG_PTR = Cardinal;
  TPsucHandle = ULONG_PTR;

function Bitmap2LCD(Psuc_Handle: TPsucHandle; Bitmap: TBitmap): integer;
var
  bmp: tagBitmap;
  Frame2LCDResult: integer;
begin
  Result := 0;

  if not assigned(Bitmap) then
  begin
    Result := -1// Bitmap ist nicht vorhanden/erstellt
    exit;
  end;

  if not ((Bitmap.Width = 128and (Bitmap.Height = 64)) then
  begin
    Result := -2// Bitmapgroesse stimmt nicht
    exit;
  end;

  if Bitmap.PixelFormat <> pf24Bit then  // nur RGB zulassen
    Bitmap.PixelFormat := pf24Bit;

  if Bitmap.HandleType <> bmDIB then  // nur DIB-Format zulassen
    Bitmap.HandleType := bmDIB;


  ZeroMemory(@bmp, sizeof(tagBitmap));
  GetObject(Bitmap.Handle, sizeof(tagBitmap), @bmp);

  Frame2LCDResult := PSUC_Frame2LCD(Psuc_Handle, bmp.bmBits, 64 * 128 * 3); // ImageSize = Höhe = 64 * Breite = 128 * RGB=3

  //  if Frame2LCDResult <> 0 then // hier Fehler auswerten siehe Docu.
  //    Result := -3; // Bitmap(roh)daten konnten nicht übertragen werden
end;


* ungetested


Crosspost im DP Bitte in Zukunft selbst mit angeben

Um was für ein Display handelt es sich denn ?

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P