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
|
Verfasst: 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:
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
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 31.07.09 09:07
Hallo und 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
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
|
Verfasst: 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.
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:
| #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); 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);
PSUC_PrintA(handle,3,2*8,"End");
PSUC_Close(handle); } return 0; } |
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
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
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
|
Verfasst: Fr 31.07.09 14:31
So sieht meine Funktion bis jetzt aus funktioniert aber leider nicht.
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
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
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
|
Verfasst: Fr 31.07.09 14:39
Und wie bekomme ich das hin?
Ich hab keine Ahnung wie ich das machen soll.
|
|
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
|
Verfasst: So 02.08.09 10:57
Ok ich habe eine Lösung gefunden.
Danke.
|
|
turboPASCAL
Beiträge: 193
Erhaltene Danke: 1
Win XP / Vischda
D6 PE / D2005 PE
|
Verfasst: So 02.08.09 10:58
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; exit; end;
if not ((Bitmap.Width = 128) and (Bitmap.Height = 64)) then begin Result := -2; exit; end;
if Bitmap.PixelFormat <> pf24Bit then Bitmap.PixelFormat := pf24Bit;
if Bitmap.HandleType <> bmDIB then Bitmap.HandleType := bmDIB;
ZeroMemory(@bmp, sizeof(tagBitmap)); GetObject(Bitmap.Handle, sizeof(tagBitmap), @bmp);
Frame2LCDResult := PSUC_Frame2LCD(Psuc_Handle, bmp.bmBits, 64 * 128 * 3); 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...
|
|
|