MacOS에서 픽셀 당 16 비트의 비트 맵을 만드는 방법은 무엇입니까?

흑표범

픽셀 당 16 비트가있는 비트 맵을 만들고 싶지만 픽셀 형식을 지정할 때 :

PixelFormat.Format16bppArgb1555, PixelFormat.Format16bppGrayScale, PixelFormat.Format16bppRgb555, PixelFormat.Format16bppRgb565

그들은 모두 System.NotImplementedException오류 메시지와 함께 발생합니다 "Not Implemented". Bitmap.SetPixel()바이트를 알파, 빨강, 녹색 또는 파랑 으로 만 설정할 수 있기 때문에 픽셀 당 16 비트를 수동으로 할당 할 수 없습니다 (따라서 특정 픽셀 형식이 필요한 마샬링을 사용해야 함). 각 색상 값에 대해 바이트를 설정하는 대신 빨강, 녹색 및 파랑 사이에 16 비트를 배포하려고합니다. 예를 들어 빨간색은 5 비트, 녹색은 5 비트, 파란색은 5 비트입니다.

다음은 a를 발생시키는 픽셀 당 16 비트 픽셀 형식 중 하나의 예입니다 System.NotImplementedException.

Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format16bppArgb1555);

내 시스템은 MacOS입니다.

György Kőszeg

System.Drawing모든 플랫폼에서 모든 픽셀 형식을 지원하지는 않습니다. 나는 일단 수집 차이를합니다 (참조 다른 플랫폼에서 사용 가능한 픽셀 형식의 제한 부분). MacOS는 Linux 버전과 동일한 패키지를 사용한다고 생각합니다.

으로 Bitmap인코더가 보존 이미지를 저장할 수 없습니다 Format16bppArgb1555어쨌든 픽셀 형식을 난 당신이 작성하는 것이 좋습니다 Bitmap(예를 들어, 가장 가까운 호환 형식을 사용하여 인스턴스를 Format32bppArgb대신 Format16bppArgb1555), 그리고 당신이 정말로에 색상을 변환하려는 경우 ARGB1555색 공간, 당신은 사용할 수 Quantize와 방법을 PredefinedColorsQuantizer.Argb1555비교를 위해 링크 한 동일한 라이브러리를 사용합니다. NuGet 에서 다운로드 할 수 있습니다 .

면책 조항 : MacOS에서 테스트하지는 않았지만 Linux (Ubuntu)에서 작동합니다.

각 색상 값에 대해 바이트를 설정하는 대신 빨강, 녹색 및 파랑 사이에 16 비트를 배포하려고합니다. 예를 들어 빨간색은 5 비트, 녹색은 5 비트, 파란색은 5 비트입니다.

편집 : 나는 이미 다음 버전에서 작업 중이며 PixelFormat모든 플랫폼에서 관리되는 비트 맵 데이터를 사용할 수 있습니다. 공개 BitmapDataFactory.CreateBitmapData 메서드를 참조하세요 (아직 공개 릴리스에서는 사용할 수 없지만 Development브랜치 를 확인하면 이미 사용할 수 있음 ).


최신 정보:

이미지 바이트 (예 : 이미지 만 나타내는 바이트, 헤더 없음)가 있으며 이미지 바이트가 디코딩 할 이미지 형식이 픽셀 당 16 비트인지 테스트 중입니다.

이제 16 비트 원시 형식으로 픽셀을 설정해야하는 이유를 알았습니다. Linux / MacOS에서 System.Drawing.Bitmap와 같이 위에서 언급 한대로 관리되는 비트 맵 데이터를 생성하는 경우 가장 쉬운 솔루션을 제한적으로 지원합니다.

참고 : 개발 브랜치를 확인하지 않고도 메서드를 사용할 수 있는 시험판을 게시했습니다 BitmapDataFactory.CreateBitmapData. 이제 원시 바이트 PixelFormat를 다음 Bitmap과 같이 바꿀 수 있습니다 .

(물론 pfGuess실제 형식이 아니면 결과가 지저분해질 수 있습니다.)

public Bitmap ToBitmap(byte[] rawData, PixelFormat pfGuess, Size size)
{
    // the result bitmap will be ARGB32, which works on every platform
    Bitmap result = new Bitmap(size.Width, size.Height);

    // we create an accessor for the result so we can quickly copy the translated pixels
    using var bitmapDataDst = result.GetWritableBitmapData();

    // For the managed source any pixel format will work.
    // Please note though that unlike System.Drawing.Bitmap images,
    // managed bitmap data never has padding bytes at the end of each line.
    // So if your rawData has padding (eg. when size has odd width and pf is 16bpp),
    // then maybe the best if you include the padding in width.
    // See https://docs.microsoft.com/en-us/windows/win32/medfound/image-stride for details
    using var bitmapDataSrc = BitmapDataFactory.CreateBitmapData(size, pfGuess);

    // Checking if rawData is long enough. RowSize is the width in bytes.
    if (rawData.Length < bitmapDataSrc.RowSize * size.Height)
        throw new ArgumentException("rawData is too short");

    int currentByte = 0;

    // iterating through rows
    for (int y = 0; y < size.Height; y++)
    {
        var rowSrc = bitmapDataSrc[y]; // has the specified pixel format
        var rowDst = bitmapDataDst[y]; // has ARGB32 pixel format

        // writing raw pixels
        for (int x = 0; x < bitmapDataSrc.RowSize; x++)
            rowSrc.WriteRaw<byte>(x, rawData[currentByte++]);

        // copying the pixels interpreted as pfGuess to result
        for (int x = 0; x < size.Width; x++)
            rowDst[x] = rowSrc[x];
    }

    // The result bitmap is now populated from the arbitrarily interpreted raw data.
    // As it has ARGB32 format you can save it on any platform without any issues.
    return result;
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

비트 맵을 병합 할 때 픽셀을 무시하는 방법은 무엇입니까?

분류에서Dev

onMeasure 후 사용자 지정 SurfaceView에서 비트 맵을 할당하는 방법은 무엇입니까?

분류에서Dev

바이트 배열에서 비트 맵을 만드는 방법은 무엇입니까?

분류에서Dev

Unity에서 WWW로 가져온 후 스프라이트의 단위당 픽셀을 변경하는 방법은 무엇입니까?

분류에서Dev

JHeatChart 히트 맵 차트에서 작은 픽셀의 경계선을 설정하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 고해상도 비트 맵을 만드는 방법은 무엇입니까?

분류에서Dev

Android : HashMap 객체에서 비트 맵을 얻는 방법은 무엇입니까?

분류에서Dev

ListView에서 비트 맵을 표시하는 방법은 무엇입니까?

분류에서Dev

64 비트 Ubuntu 16에 32 비트 libcurl을 설치하는 방법은 무엇입니까?

분류에서Dev

SKBitmap SKiaSharp에서 비트 맵 픽셀을 재설정하는 방법

분류에서Dev

Common Lisp에서 비트 배열을 만드는 방법은 무엇입니까?

분류에서Dev

R에서 Pathway Enrichment 히트 맵을 만드는 방법은 무엇입니까?

분류에서Dev

캔버스에서 선택한 영역의 비트 맵을 자르는 방법은 무엇입니까?

분류에서Dev

비트 맵 이미지의 RGB 값에서 배열을 얻는 방법은 무엇입니까?

분류에서Dev

Delphi XE8에서 비트 맵의 스케일을 아는 방법은 무엇입니까?

분류에서Dev

View 클래스를 고려하여 레이아웃에서 이미지 뷰인 자식에게 비트 맵을 할당하는 방법은 무엇입니까?

분류에서Dev

BitmapImage에서 바이트 단위로 WriteableBitmap에 픽셀을 쓰는 방법은 무엇입니까?

분류에서Dev

FreeBSD에서 인터페이스 당 네트워크 트래픽을 보는 방법은 무엇입니까?

분류에서Dev

안드로이드에서 문자열의 픽셀 너비를 얻는 방법은 무엇입니까?

분류에서Dev

무료 할당에서 하드 드라이브의 비트 맵을 계산하는 방법

분류에서Dev

ARM64에서 16 비트 정수 배열을 초기화하는 방법은 무엇입니까?

분류에서Dev

C #에서 16 진수 값을 비트 위치 [BitMapping]으로 변환하는 방법은 무엇입니까?

분류에서Dev

Julia에서 카운트 맵과 비례 맵을 결합하는 방법은 무엇입니까?

분류에서Dev

64 비트 버전에서 32 비트 프로그램을 만드는 방법은 무엇입니까?

분류에서Dev

안드로이드에서 비트 맵의 색상을 변경하기 위해 비트 맵 픽셀을 반복

분류에서Dev

비트 맵의 알파 값을 고려하여 캔버스에 비트 맵을 그리는 방법은 무엇입니까?

분류에서Dev

두 비트 맵의 값을 확인하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 각 픽셀에 고유 한 색상을 할당하는 방법은 무엇입니까?

분류에서Dev

X11에서 색상 수 (픽셀 당 비트)를 결정하는 방법

Related 관련 기사

  1. 1

    비트 맵을 병합 할 때 픽셀을 무시하는 방법은 무엇입니까?

  2. 2

    onMeasure 후 사용자 지정 SurfaceView에서 비트 맵을 할당하는 방법은 무엇입니까?

  3. 3

    바이트 배열에서 비트 맵을 만드는 방법은 무엇입니까?

  4. 4

    Unity에서 WWW로 가져온 후 스프라이트의 단위당 픽셀을 변경하는 방법은 무엇입니까?

  5. 5

    JHeatChart 히트 맵 차트에서 작은 픽셀의 경계선을 설정하는 방법은 무엇입니까?

  6. 6

    파이썬에서 고해상도 비트 맵을 만드는 방법은 무엇입니까?

  7. 7

    Android : HashMap 객체에서 비트 맵을 얻는 방법은 무엇입니까?

  8. 8

    ListView에서 비트 맵을 표시하는 방법은 무엇입니까?

  9. 9

    64 비트 Ubuntu 16에 32 비트 libcurl을 설치하는 방법은 무엇입니까?

  10. 10

    SKBitmap SKiaSharp에서 비트 맵 픽셀을 재설정하는 방법

  11. 11

    Common Lisp에서 비트 배열을 만드는 방법은 무엇입니까?

  12. 12

    R에서 Pathway Enrichment 히트 맵을 만드는 방법은 무엇입니까?

  13. 13

    캔버스에서 선택한 영역의 비트 맵을 자르는 방법은 무엇입니까?

  14. 14

    비트 맵 이미지의 RGB 값에서 배열을 얻는 방법은 무엇입니까?

  15. 15

    Delphi XE8에서 비트 맵의 스케일을 아는 방법은 무엇입니까?

  16. 16

    View 클래스를 고려하여 레이아웃에서 이미지 뷰인 자식에게 비트 맵을 할당하는 방법은 무엇입니까?

  17. 17

    BitmapImage에서 바이트 단위로 WriteableBitmap에 픽셀을 쓰는 방법은 무엇입니까?

  18. 18

    FreeBSD에서 인터페이스 당 네트워크 트래픽을 보는 방법은 무엇입니까?

  19. 19

    안드로이드에서 문자열의 픽셀 너비를 얻는 방법은 무엇입니까?

  20. 20

    무료 할당에서 하드 드라이브의 비트 맵을 계산하는 방법

  21. 21

    ARM64에서 16 비트 정수 배열을 초기화하는 방법은 무엇입니까?

  22. 22

    C #에서 16 진수 값을 비트 위치 [BitMapping]으로 변환하는 방법은 무엇입니까?

  23. 23

    Julia에서 카운트 맵과 비례 맵을 결합하는 방법은 무엇입니까?

  24. 24

    64 비트 버전에서 32 비트 프로그램을 만드는 방법은 무엇입니까?

  25. 25

    안드로이드에서 비트 맵의 색상을 변경하기 위해 비트 맵 픽셀을 반복

  26. 26

    비트 맵의 알파 값을 고려하여 캔버스에 비트 맵을 그리는 방법은 무엇입니까?

  27. 27

    두 비트 맵의 값을 확인하는 방법은 무엇입니까?

  28. 28

    파이썬에서 각 픽셀에 고유 한 색상을 할당하는 방법은 무엇입니까?

  29. 29

    X11에서 색상 수 (픽셀 당 비트)를 결정하는 방법

뜨겁다태그

보관