سؤال

لا بد لي من قراءة أ 24bpp Bitmap وتحويل كل بكسل من RGB24 ل ARGB16.

لقد استخدمت الكود التالي ،

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))

لكنني لا أحصل على الإخراج المطلوب.

أي مساعدة سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

ننفصل. دعنا نستمر في استخدام وحدات الماكرو:

#define TRUNCATE(x)  ((x) >> 3)

#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))

هذا يفترض أن ألفا هو مجرد قليلا.

نصائح أخرى

نظرًا لأن قيم RGB ربما تكون 8 بتات لكل منها ، فلا يزال عليك اقتطاعها إلى خمسة بتات حتى لا تتداخل "في قيمة ArgB16.

أسهل طريقة لاقتطاعهم هي ربما لتوسيعهم إلى اليمين من خلال ثلاثة أماكن.

يبدو لي وكأنك ربما تريد إخفاء البتات التي لا تحتاجها من R و G و B. ربما شيء من هذا القبيل:

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))

تحرير: يصيح ، أعتقد أن إجابة مايكل بودينج على الأرجح - ستحتاج إلى الانتقال ، وهذا يجعلك أهم البتات.

أود إما استخدام Bitmask للتخلص من البتات التي لا تحتاجها: (ColorValue & 0x1F).

إما تحويل قيمة اللون إلى 3 بتات اليمنى (يبدو أن الخيار الأفضل).

وهل << 15 حقًا ما تحتاجه؟ سوف تعتمد على حقيقة أن 0 بت 0 أو 1 لتعيين بت alpha على أو إيقاف تشغيله. لذا ، إذا كانت قيمة ألفا الخاصة بك هي 0xfe ، فستكون بت alpha 0 ، بينما إذا كانت 0x01 فستكون 1.

قد ترغب في توسيع نطاق بدلاً من truncat.

خذ مكون R على سبيل المثال ، 0xDE(222) في 24bit سيصبح RGB 0x1A = (222.0/0xFF)*0x1F في 16bit RGB.

لدي الرمز المربع:

    FILE *inFile;
BmpHeader header;
BmpImageInfo info;
Rgb *palette;
int i = 0;

    inFile = fopen( "red.bmp", "rb" );

fread(&header, 1, sizeof(BmpHeader), inFile);
fread(&info, 1, sizeof(BmpImageInfo), inFile);

palette = (Rgb*)malloc(sizeof(Rgb) * info.numColors);

fread(palette, sizeof(Rgb), info.numColors, inFile);

unsigned char buffer[info.width*info.height];

FILE *outFile = fopen( "red.a", "wb" );
Rgb *pixel = (Rgb*) malloc( sizeof(Rgb) );

int read, j;

for( j=info.height; j>0; j-- ) 
{
    for( i=0; i<info.width; i++ ) 
    {
        fread(pixel, 1, sizeof(Rgb), inFile);
        buffer[i] = ARGB16(0, pixel->red, pixel->green, pixel->blue);
    }
}

    fwrite(buffer, 1, sizeof(buffer), outFile);

وأنا أقرأ صورة حمراء (255 0 0) ، وأنا أستخدم الوظيفة المحددة من قبلك أعلاه (#define argb16 (a ، r ، g ، b) ((a) << 15) | (r >> 3 )تش 7C00 ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top