C ++에서 Windows 비트 맵을 Actionscript 비트 맵으로 변환하는 방법

T. 리히터

Windows 8 시스템에서 Actionscript Camera API의 일부 (많은) 문제를 피하기 위해 카메라를 처리하는 기본 확장을 만들기로 결정했습니다.

지금은 카메라 부분과 AIR 런타임과 통신하기위한 모든 접착제가 실제로 작동하고 있으므로 AIR에서 버튼을 클릭하면 System :: Drawing :: Bitmap을 반환하는 새 Windows 창이 열립니다.

내 임무는 지금

a) FREBitmapData 객체를 생성하고

b) Windows 비트 맵에서 BitmapData를 채 웁니다.

며칠 전에는 쉬울 거라고 생각했는데 ... C ++에 익숙하지 않기 때문에 전혀 작동하지 않았습니다.

지금까지 시도한 내용은 다음과 같습니다.

bmp = form1->bitmap; // bmp is a handle to the System::Drawing::Bitmap returned from the external window
// Lock the bitmap's bits.  
Rectangle rect = Rectangle(0, 0, bmp->Width, bmp->Height);
System::Drawing::Imaging::BitmapData^ bmpData = bmp->LockBits(rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat);
// Get the address of the first line.
IntPtr ptr = bmpData->Scan0;
// Declare an array to hold the bytes of the bitmap.
// This code is specific to a bitmap with 24 bits per pixels.
int inputLength = Math::Abs(bmpData->Stride) * bmp->Height;
array<Byte>^ input = gcnew array<Byte>(inputLength);
// Copy the RGB values into the array.
System::Runtime::InteropServices::Marshal::Copy(ptr, input, 0, inputLength);
// Unlock the bits.
bmp->UnlockBits(bmpData);
// Create a FREByteArray to hold the data.
// Don't know, if this is necessary
FREObject* outputObject;
FREByteArray* outputBytes = new FREByteArray;
outputBytes->length = inputLength;
outputBytes->bytes = (uint8_t *) &input;
FREAcquireByteArray(outputObject, outputBytes);
// now copy it over
memcpy(outputBytes->bytes, &input, inputLength);
FREReleaseByteArray(outputObject);
// we create a new instance of BitmapData here, 
// as we cannot simply pass it over in the args,
// because we don't know it's correct size at extension creation
FREObject* width;
FRENewObjectFromUint32(bmp->Width, width);
FREObject* height;
FRENewObjectFromUint32(bmp->Height, height);
FREObject* transparent;
FRENewObjectFromBool(uint32_t(0), transparent);
FREObject* fillColor;
FRENewObjectFromUint32(uint32_t(0xFFFFFF), fillColor);
FREObject obs[4] = { width, height, transparent, fillColor };
// we create some Actionscript Intsances here, we want to send back
FREObject* asBmpObj;
FRENewObject("BitmapData", 4, obs, asBmpObj, NULL);
// Now we have our AS bitmap data, copy bytes over
FREBitmapData* asData;
FREAcquireBitmapData(asBmpObj, asData);
// Now what? asData->bits32 won't accept array<Bytes> or any other value I've tried.
return asBmpObj;

기본 아이디어는 다음과 같습니다.

a) 원본 Win 비트 맵의 ​​크기와 비트 깊이를 확인합니다 (크기는 카메라 창에서 선택한 캠 해상도에 따라 결정됨).

b) 바이트를 배열에 씁니다. 필요에 따라 32 비트로 변환합니다. (아직 아이디어가 누락되었습니다.)

c) 동일한 크기의 AS 비트 맵을 만듭니다. 비트 심도는 항상 32 여야합니다.

d) 배열을 AS 비트 맵으로 복사합니다.

그러나 나는 이것을 달성 할 수 없습니다. 어떤 충고? 감사합니다!

T. 리히터

나는 마침내 그것을 알아 냈습니다.

아래 코드는 24to32 비트 변환을 처리하지 않지만 실제로 내 응용 프로그램에서 잘 작동하므로 공유 할 수 있다고 생각했습니다.

FREObject launch(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
    System::Drawing::Bitmap^ windowsBitmap;
    SKILLCamControl::CamControlForm^ form1;
    form1 = gcnew SKILLCamControl::CamControlForm();

    DialogResult dr;
    // Show testDialog as a modal dialog and determine if DialogResult = OK.
    dr = form1->ShowDialog();
    if (dr == DialogResult::OK) {

        windowsBitmap = form1->bitmap;
        int bmpW = windowsBitmap->Width;
        int bmpH = windowsBitmap->Height;

        // we create a new instance of BitmapData here, 
        // as we cannot simply pass it over in the args,
        // because we don't know it's correct size at extension creation
        FREObject width;
        FRENewObjectFromUint32( uint32_t(bmpW), &width);

        FREObject height;
        FRENewObjectFromUint32( uint32_t(bmpH), &height);

        FREObject transparent;
        FRENewObjectFromBool( uint32_t(0), &transparent);
        FREObject fillColor;
        FRENewObjectFromUint32( uint32_t(0xFF0000), &fillColor);

        FREObject obs[4] = { width, height, transparent, fillColor };

        FREObject freBitmap;
        FRENewObject((uint8_t *)"flash.display.BitmapData", 4, obs, &freBitmap , NULL);
        FREBitmapData2 freBitmapData;
        FREAcquireBitmapData2(freBitmap, &freBitmapData);

        // is inverted?
        if (&freBitmapData.isInvertedY != (uint32_t*)(0) ) windowsBitmap->RotateFlip(RotateFlipType::RotateNoneFlipY);

        int pixelSize = 4;
        //Rect rect( 0, 0, freBitmap.width, freBitmap.height );
        System::Drawing::Rectangle rect(0, 0, bmpW, bmpH);
        BitmapData^ windowsBitmapData = windowsBitmap->LockBits(rect, ImageLockMode::ReadOnly, PixelFormat::Format32bppArgb);

        for (int y = 0; y < bmpH ; y++)
        {
            //get pixels from each bitmap
            byte* oRow = (byte*)windowsBitmapData->Scan0.ToInt32() + (y * windowsBitmapData->Stride);
            byte* nRow = (byte*)freBitmapData.bits32 + (y * freBitmapData.lineStride32 * 4);

            for (int x = 0; x < bmpW ; x++)
            {
                // set pixels
                nRow[x * pixelSize] = oRow[x * pixelSize]; //B
                nRow[x * pixelSize + 1] = oRow[x * pixelSize + 1]; //G
                nRow[x * pixelSize + 2] = oRow[x * pixelSize + 2]; //R
            }

        }
        // Free resources           
        FREReleaseBitmapData(freBitmap);
        FREInvalidateBitmapDataRect(freBitmap, 0, 0, bmpW, bmpH);

        windowsBitmap->UnlockBits(windowsBitmapData);
        delete windowsBitmapData;
        delete windowsBitmap;

        return freBitmap;

    }
    else if (dr == DialogResult::Cancel)
    {
        return NULL;
    }

    return NULL;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

WPF에서 독립적으로 비트 맵 Windows 확대 / 축소 수준 (DPI?)을 표시하는 방법

분류에서Dev

UWP에서 비디오의 프레임을 비트 맵으로 읽는 방법

분류에서Dev

높이에 비례하는 ActionScript 3 비트 맵 너비

분류에서Dev

R에서 행렬을 원시 비트 맵으로 작성하는 방법

분류에서Dev

R에서 작은 양으로 비트 맵을 회전하는 방법

분류에서Dev

조각에서 활동으로 비트 맵을 전달하는 방법?

분류에서Dev

System.Byte []를 비트 맵으로 변환하는 방법?

분류에서Dev

Flutter-SVG 파일을 비트 맵으로 변환하는 방법

분류에서Dev

LayerDrawable을 비트 맵으로 변환하는 방법은 무엇입니까?

분류에서Dev

AS3 : ActionScript로 비트 맵을 업데이트하는 더 빠른 방법입니까?

분류에서Dev

Android 앱의 비동기 작업에서 비트 맵을 반환하는 방법

분류에서Dev

C에서 비트 맵 만들기-/ r / n을 1 바이트로 작성하는 방법?

분류에서Dev

Android에서 SmbFile (Samba)을 비트 맵으로 변환

분류에서Dev

Objective C를 사용하여 iOS에서 JPEG를 비트 맵으로 변환?

분류에서Dev

SimpleDraweeView에 로컬 비트 맵을 표시하는 방법

분류에서Dev

어떻게 비트 맵을 그릴 수 및 변환에서 이미지를로드하는 방법

분류에서Dev

Android에서 비트 맵을 jpeg 파일로 변환하는 방법은 무엇입니까?

분류에서Dev

비트 맵 이미지에 로그 축을 그리는 방법

분류에서Dev

격자보기에서 비트 맵을 설정하는 방법

분류에서Dev

안드로이드 코드를 압축 비트 맵에서 reszie 또는 스케일링 된 비트 맵으로 변경하는 방법은 무엇입니까?

분류에서Dev

C # 코드에서 fastai (pytorch)를 사용하여 평균 및 표준으로 비트 맵을 정규화하는 방법은 무엇입니까?

분류에서Dev

Android에서 이미지 URL을 비트 맵으로 변환 할 때 java.lang.OutOfMemoryError 예외를 해결하는 방법은 무엇입니까?

분류에서Dev

libgdx에서 비트 맵 글꼴을 늘리는 방법

분류에서Dev

비트 맵 이미지에서 빈 영역을 찾는 방법

분류에서Dev

AutoIt에서 비트 맵을 자르는 방법?

분류에서Dev

안드로이드, 비트 맵을 파일 객체로 변환하는 방법

분류에서Dev

c # : 비트 맵을 투명하게 만드는 방법

분류에서Dev

C-두 비트 맵을 OR하는 가장 빠른 방법

분류에서Dev

드로어 블을 크기가 조정 된 비트 맵으로 변환하는 방법

Related 관련 기사

  1. 1

    WPF에서 독립적으로 비트 맵 Windows 확대 / 축소 수준 (DPI?)을 표시하는 방법

  2. 2

    UWP에서 비디오의 프레임을 비트 맵으로 읽는 방법

  3. 3

    높이에 비례하는 ActionScript 3 비트 맵 너비

  4. 4

    R에서 행렬을 원시 비트 맵으로 작성하는 방법

  5. 5

    R에서 작은 양으로 비트 맵을 회전하는 방법

  6. 6

    조각에서 활동으로 비트 맵을 전달하는 방법?

  7. 7

    System.Byte []를 비트 맵으로 변환하는 방법?

  8. 8

    Flutter-SVG 파일을 비트 맵으로 변환하는 방법

  9. 9

    LayerDrawable을 비트 맵으로 변환하는 방법은 무엇입니까?

  10. 10

    AS3 : ActionScript로 비트 맵을 업데이트하는 더 빠른 방법입니까?

  11. 11

    Android 앱의 비동기 작업에서 비트 맵을 반환하는 방법

  12. 12

    C에서 비트 맵 만들기-/ r / n을 1 바이트로 작성하는 방법?

  13. 13

    Android에서 SmbFile (Samba)을 비트 맵으로 변환

  14. 14

    Objective C를 사용하여 iOS에서 JPEG를 비트 맵으로 변환?

  15. 15

    SimpleDraweeView에 로컬 비트 맵을 표시하는 방법

  16. 16

    어떻게 비트 맵을 그릴 수 및 변환에서 이미지를로드하는 방법

  17. 17

    Android에서 비트 맵을 jpeg 파일로 변환하는 방법은 무엇입니까?

  18. 18

    비트 맵 이미지에 로그 축을 그리는 방법

  19. 19

    격자보기에서 비트 맵을 설정하는 방법

  20. 20

    안드로이드 코드를 압축 비트 맵에서 reszie 또는 스케일링 된 비트 맵으로 변경하는 방법은 무엇입니까?

  21. 21

    C # 코드에서 fastai (pytorch)를 사용하여 평균 및 표준으로 비트 맵을 정규화하는 방법은 무엇입니까?

  22. 22

    Android에서 이미지 URL을 비트 맵으로 변환 할 때 java.lang.OutOfMemoryError 예외를 해결하는 방법은 무엇입니까?

  23. 23

    libgdx에서 비트 맵 글꼴을 늘리는 방법

  24. 24

    비트 맵 이미지에서 빈 영역을 찾는 방법

  25. 25

    AutoIt에서 비트 맵을 자르는 방법?

  26. 26

    안드로이드, 비트 맵을 파일 객체로 변환하는 방법

  27. 27

    c # : 비트 맵을 투명하게 만드는 방법

  28. 28

    C-두 비트 맵을 OR하는 가장 빠른 방법

  29. 29

    드로어 블을 크기가 조정 된 비트 맵으로 변환하는 방법

뜨겁다태그

보관