アセンブラでロジックを書くのは初めてかな
#include <cstdint> #include <fstream> using namespace std; int main() { static const int IMG_HEADER_SIZE = 54; uint8_t* hdr = new uint8_t[IMG_HEADER_SIZE]; memset(hdr, 0, IMG_HEADER_SIZE); static const int IMG_DATA_SIZE = 1024*768*3; uint8_t* img = new uint8_t[IMG_DATA_SIZE]; memset(img, 0, IMG_DATA_SIZE); ifstream input_file("C:\\Users\\xxxxx\\Desktop\\Desert.bmp", ios::binary); input_file.read(reinterpret_cast<char*>(hdr), IMG_HEADER_SIZE); input_file.read(reinterpret_cast<char*>(img), IMG_DATA_SIZE); for (int i = 0; i < IMG_DATA_SIZE; i+=3) { static const int GS_R8_WEIGHT = static_cast<int>(0.298912 * 256); static const int GS_G8_WEIGHT = static_cast<int>(0.586611 * 256); static const int GS_B8_WEIGHT = static_cast<int>(0.114478 * 256); uint8_t r8 = img[i+0]; uint8_t g8 = img[i+1]; uint8_t b8 = img[i+2]; uint16_t tmp1; uint8_t result; __asm { mov tmp1, 0x00 mov ah, 0 mov al, r8 mul GS_R8_WEIGHT mov tmp1, ax mov ah, 0 mov al, g8 mul GS_G8_WEIGHT add tmp1, ax mov ah, 0 mov al, b8 mul GS_B8_WEIGHT add tmp1, ax shr tmp1, 8 push tmp1 pop result } img[i+0] = result; img[i+1] = result; img[i+2] = result; } ofstream output_file("C:\\Users\\xxxxx\\Desktop\\Desert_grayscale.bmp", ios::binary); output_file.write(reinterpret_cast<char*>(hdr), IMG_HEADER_SIZE); output_file.write(reinterpret_cast<char*>(img), IMG_DATA_SIZE); output_file.close(); delete[] hdr; delete[] img; return 0; }
0 件のコメント:
コメントを投稿