bool WebPDecoder::readData(Mat &img) { if( m_width > 0 && m_height > 0 ) { if (img.cols != m_width || img.rows != m_height || img.type() != m_type) { img.create(m_height, m_width, m_type); } uchar* out_data = img.data; size_t out_data_size = img.cols * img.rows * img.elemSize(); uchar *res_ptr = 0; if (channels == 3) { res_ptr = WebPDecodeBGRInto(data.data, data.total(), out_data, out_data_size, img.step); } else if (channels == 4) { res_ptr = WebPDecodeBGRAInto(data.data, data.total(), out_data, out_data_size, img.step); } if(res_ptr == out_data) { return true; } } return false; }
bool QWebpHandler::read(QImage *image) { if (!ensureScanned() || device()->isSequential()) return false; if (m_hasFirstFrameRead) { if (!WebPDemuxNextFrame(&m_iter)) return false; } else { m_hasFirstFrameRead = true; } WebPBitstreamFeatures features; VP8StatusCode status = WebPGetFeatures(m_iter.fragment.bytes, m_iter.fragment.size, &features); if (status != VP8_STATUS_OK) return false; QImage result(features.width, features.height, QImage::Format_ARGB32); uint8_t *output = result.bits(); size_t output_size = result.byteCount(); #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN if (!WebPDecodeBGRAInto( reinterpret_cast<const uint8_t*>(m_iter.fragment.bytes), m_iter.fragment.size, output, output_size, result.bytesPerLine())) #else if (!WebPDecodeARGBInto( reinterpret_cast<const uint8_t*>(m_iter.fragment.bytes), m_iter.fragment.size, output, output_size, result.bytesPerLine())) #endif return false; *image = result; return true; }
cairo_surface_t* guacenc_webp_decoder(unsigned char* data, int length) { int width, height; /* Validate WebP and pull dimensions */ if (!WebPGetInfo((uint8_t*) data, length, &width, &height)) { guacenc_log(GUAC_LOG_WARNING, "Invalid WebP data"); return NULL; } /* Create blank Cairo surface */ cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); /* Fill surface with opaque black */ cairo_t* cairo = cairo_create(surface); cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 1.0); cairo_paint(cairo); cairo_destroy(cairo); /* Finish any pending draws */ cairo_surface_flush(surface); /* Pull underlying buffer and its stride */ int stride = cairo_image_surface_get_stride(surface); unsigned char* image = cairo_image_surface_get_data(surface); /* Read WebP into surface */ uint8_t* result = WebPDecodeBGRAInto((uint8_t*) data, length, (uint8_t*) image, stride * height, stride); /* Verify WebP was successfully decoded */ if (result == NULL) { guacenc_log(GUAC_LOG_WARNING, "Invalid WebP data"); cairo_surface_destroy(surface); return NULL; } /* WebP was read successfully */ return surface; }
Bitmap *ImageFromData(const char *data, size_t len) { int w, h; if (!WebPGetInfo((const uint8_t *)data, len, &w, &h)) return nullptr; Bitmap bmp(w, h, PixelFormat32bppARGB); Rect bmpRect(0, 0, w, h); BitmapData bmpData; Status ok = bmp.LockBits(&bmpRect, ImageLockModeWrite, PixelFormat32bppARGB, &bmpData); if (ok != Ok) return nullptr; if (!WebPDecodeBGRAInto((const uint8_t *)data, len, (uint8_t *)bmpData.Scan0, bmpData.Stride * h, bmpData.Stride)) return nullptr; bmp.UnlockBits(&bmpData); // hack to avoid the use of ::new (because there won't be a corresponding ::delete) return bmp.Clone(0, 0, w, h, PixelFormat32bppARGB); }
bool WebPDecoder::readData(Mat &img) { CV_CheckGE(m_width, 0, ""); CV_CheckGE(m_height, 0, ""); CV_CheckEQ(img.cols, m_width, ""); CV_CheckEQ(img.rows, m_height, ""); if (m_buf.empty()) { fs.seekg(0, std::ios::beg); CV_Assert(fs && "File stream error"); data.create(1, validateToInt(fs_size), CV_8UC1); fs.read((char*)data.ptr(), fs_size); CV_Assert(fs && "Can't read file data"); fs.close(); } CV_Assert(data.type() == CV_8UC1); CV_Assert(data.rows == 1); { Mat read_img; CV_CheckType(img.type(), img.type() == CV_8UC1 || img.type() == CV_8UC3 || img.type() == CV_8UC4, ""); if (img.type() != m_type) { read_img.create(m_height, m_width, m_type); } else { read_img = img; // copy header } uchar* out_data = read_img.ptr(); size_t out_data_size = read_img.dataend - out_data; uchar *res_ptr = NULL; if (channels == 3) { CV_CheckTypeEQ(read_img.type(), CV_8UC3, ""); res_ptr = WebPDecodeBGRInto(data.ptr(), data.total(), out_data, (int)out_data_size, (int)read_img.step); } else if (channels == 4) { CV_CheckTypeEQ(read_img.type(), CV_8UC4, ""); res_ptr = WebPDecodeBGRAInto(data.ptr(), data.total(), out_data, (int)out_data_size, (int)read_img.step); } if (res_ptr != out_data) return false; if (read_img.data == img.data && img.type() == m_type) { // nothing } else if (img.type() == CV_8UC1) { cvtColor(read_img, img, COLOR_BGR2GRAY); } else if (img.type() == CV_8UC3 && m_type == CV_8UC4) { cvtColor(read_img, img, COLOR_BGRA2BGR); } else if (img.type() == CV_8UC4 && m_type == CV_8UC3) { cvtColor(read_img, img, COLOR_BGR2BGRA); } else { CV_Error(Error::StsInternal, ""); } } return true; }