1 // Copyright 2015 Google Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 //////////////////////////////////////////////////////////////////////////////// 16 // 17 // The purpose of the preview-image-extractor (piex) is to find and extract the 18 // largest JPEG compressed preview image contained in a RAW file. 19 // 20 // Even for unsupported RAW files we want to provide high quality images using a 21 // dedicated, small and portable library. That is possible by taking the preview 22 // image contained in all RAW files. 23 // 24 // Typically a preview image is stored as JPEG compressed, full size (or at 25 // least half size) image in a RAW file. 26 // 27 // A typical client code snippet: 28 // 29 // // In C++ 30 // PreviewImageData image_data; 31 // unique_ptr<StreamInterface> data_stream(new DataStream(file)); 32 // Error err = GetPreviewImageData(data_stream.get(), &image_data)); 33 // if (err == Error::kFail) { 34 // // The input data seems to be broken. 35 // return; 36 // } else if (err == Error::kUnsupported) { 37 // // The input data is not supported. 38 // return; 39 // } 40 // 41 // // Uncompress the JPEG as usual, e.g. on Android with the BitmapFactory: 42 // // In Java 43 // Bitmap bitmap = BitmapFactory.decodeByteArray( 44 // file.at(image_data.preview_offset), image_data.preview_length); 45 46 #ifndef PIEX_PIEX_H_ 47 #define PIEX_PIEX_H_ 48 49 #include <string> 50 #include <vector> 51 52 #include "src/piex_types.h" 53 54 namespace piex { 55 56 // Returns the maximum number of bytes IsRaw() will read from the stream. 57 size_t BytesRequiredForIsRaw(); 58 59 // Returns true if 'data' contains a RAW file format, even if it is not 60 // supported by Piex, false otherwise. Reads at most BytesRequiredForIsRaw() 61 // from the stream. 62 bool IsRaw(StreamInterface* data); 63 64 // Gets the largest JPEG compressed preview image data. On success 65 // 'preview_image_data' contains image metadata, the unverified length and the 66 // offset to a JPEG compressed image from the beginning of the file. 67 // 68 // Returns 'kFail' when something with the data is wrong. 69 // Returns 'kUnsupported' if file format is not supported. 70 // 71 // One could check the "preview_image_data->preview_length != 0" for the 72 // existance of a preview image. 73 Error GetPreviewImageData(StreamInterface* data, 74 PreviewImageData* preview_image_data); 75 76 // Returns true if the full width and height and the mosaic pattern dimension of 77 // a DNG image could be obtained. False otherwise. 78 bool GetDngInformation(StreamInterface* data, std::uint32_t* width, 79 std::uint32_t* height, 80 std::vector<std::uint32_t>* cfa_pattern_dim); 81 82 // Returns true if Exif orientation for the image can be obtained. False 83 // otherwise. 84 bool GetOrientation(StreamInterface* data, std::uint32_t* orientation); 85 86 // Returns a vector of upper case file extensions, which are used as a first 87 // step to quickly guess a supported file format. 88 std::vector<std::string> SupportedExtensions(); 89 90 } // namespace piex 91 92 #endif // PIEX_PIEX_H_ 93